Pencarian

Rabu, 11 Maret 2009

Fungsi untuk Filter HTML dan PHP

Di PHP ada beberapa fungsi yang disediakan untuk memfilter form input yang kita miliki dari fungsi html atau php itu sendiri, istilahnya Jeruk makan Jeruk lah hee..
Kalo katanya sih PHP Injection, bayangkan kalo kita tidak memfilter inputan dari user.

Misalanya pada form input buku tamu, ada seorang user nakal yang mengisi di teks filed komentar kita seperti ini : "komentar saya adalah <img src=http://photogallery.com/sexygirl.php> "

maka akan tampillah photo sexygirl tersebut pada buku tamu kita. atau lebih parah lagi kalo user mamsukkan perintah PHP/Query Sql seperti untuk menghapus atau mengubah query dan bla..bla..nya... waduuuhhh, bisa mampus dah....

Nah, untungnya di php ada fungsi untuk mengatasi permasalahan tersebut antara lain yaitu :
1. htmlentities
2. htmlspecialchars
3. strip_tags
4. mysql_real_escape_string
cara memakai ke tiga fungsi tersebut sama, tapi mempunyai fungsi yang cukup berbeda.

contohnya, buat satu file dengan nama filter.php lalu tuliskan seperti ini:
<?php
$text = '<a href=index.php>belajar</a> <?php echo " inject ah"; ?>';
$a = htmlentities($text);
$b = htmlspecialchars($text);
$c = strip_tags($text);
echo $a;
echo "<br>";
echo $b;
echo "<br>";
echo $c;
?>

maka akan menghasilkan output seperti ini :
<a href=index.php>belajar</a> <?php echo " inject ah"; ?>
<a href=index.php>belajar</a> <?php echo " inject ah"; ?>
belajar

Perbedaan antara htmlentities dan strip_tags menurut saya, strip-tags membersihkan semua coding html/php dan hanya menampilkan teks biasa sedangkan htmlentities dan htmlspecialchars akan menjadikan coding html/php menjadi seperti teks biasa, tidak membersihkan nya seperti yang dilakukan oleh si strip_tags.

Pada htmlentities dan htmlspecialchars fungsi html/php akan di ubah menjadi quote
seperti ini :
$text = '&lt;a href=index.php&gt;belajar&lt;/a&gt; &lt;?php echo &quot;inject ah&quot;; ?&gt;';<br />

Hal ini akan terlihat ketika kita menfilter input dan memasukkan data yang sudah terfilter tersebut ke dalam database. Perbedaannya antara htmlentities dan htmlspecialchars adalah karakter quote style yang didukungnya.

Fungsi ini bisa dipakai, misalnya seperti ini:
$komentar = htmlentities(strip_tags($_POST['komentar']));
atau pada get juga bisa :
$id = htmlentities(strip_tags($_GET['komentar']));

dan untuk menghindari Sql Injection bisa memakai.
mysql_real_escape_string
jadinya seperti ini:
$id = mysql_real_escape_string(htmlentities(strip_tags($_POST['komentar'])));
mysql_real_escape_string akan memberikan slash (\) jika terdapat kutip (') yang biasa dipakai untuk mengecek vulner Sql Injection.

Untuk mengembalikan hasil convert htmlentities atau htmlspecialchar kita bisa memakai fungsi:
1. htmlspecialchars_decode
2. html_entity_decode
cara memakainya pun sama seperti diatas.

Saya membuat sebuah form untuk conversi html/php yang memudahkan saya ketika saya ingin menuliskan artikel yang berisi syntax PHP/HTML di blog.
kira-kira seperti yang saya buat.
pertama saya buat classFilter.php (lagi belajar OOP neh)..

<?php
//membuat classFilter
class classFilter
{
//fungsi untuk encode
function encodeHtml($text)
{
$text = htmlspecialchars($text);
//kembalikan nilai variabelnya
return $text;
}
//fungsi untuk decode
function decodeHtml($text)
{
$text = htmlspecialchars_decode($text);
//kembalikan nilai variabelnya
return $text;
}
}
?>

trus saya buat file encode.php seperti ini :

<?php
//memanggil classFilter.php
require_once "classFilter.php";
?>
<!-- By : a3m.nix.blogspot.com !-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Encode + Decode</title>
</head>
<body>
<form id="form1" name="form1" method="POST" action="<?php echo "$_SERVER[PHP_SELF]";?>">
TEXT/HTML
<p>
<textarea name="text" cols="120" rows=5></textarea>
</p>
<input name="c" type="radio" value="encode" />&nbsp;Encode
<input name="c" type="radio" value="decode" />&nbsp;Decode<br>
<p>
<input type="submit" name="Submit" value="Submit" >
</p>
</form>
<p>&nbsp; </p>
</body>
</html>
<?php
//ambil data post
$text = $_POST['text'];
$c = $_POST['c'];
//membuat objek dari classFilter
$ofilter = new classFilter();
//jika user memilih encode
if ($c == "encode")
{
//memanggil fungsi encode yang terdapat di classFilter
$hasil = $ofilter->encodeHtml($text);
//encode lagi memakai fungsi htmlspecialchars
$hasil = htmlspecialchars($hasil);
}
//jika user memilih decode
else if ($c == "decode")
{
//memanggil fungsi untuk mengembalikan conversi html/php
$hasil = $ofilter->decodeHtml($text);
}
else
{
//jika tidak dipilih
$hasil = "Choose dulu dunk...!!!";
}
//menampilkan hasilnya ke dalam textarea
echo "<b>Output $c</b>
<br><textarea name=text cols=120 rows=15 readonly=readonly>$hasil</textarea>";
?>

Jadi dah, tinggal dipake aja kalo saya ingin menulis artikel yang terdapat tag html/php di blog saya seperti diatas, saya nggak perlu pake dreamweaver lagi.

Pada Script diatas saya melakukan 2x encode, pertama di classFilter yang kedua di file encode.
Ketika saya mencoba encode sekali trus langsung di tampilkan maka htmlentities atau htmlspecialchars hanya akan menampilkan syntax html/php apa adanya, tidak mengkonversi syntax tsb menjadi karakter quote style, tapi pada kasus menyimpan ke database, tidak perlu sampai 2x encode, cukup sekali saja udah mau, mungkin ada pengaturan pada webserver saya yang perlu diubah atau masih ada yang salah pada coding saya (beginner ne ).

Contoh file nya bisa diambil di sini.
atau http://www.ziddu.com/download/3823062/encode.rar.html
Selamat mencoba...

7 komentar:

  1. Artikelnya membantu banget ne

    BalasHapus
  2. cakepp.. cuman begini kalau dipraktekkan pada form input artikel repot juga, soalnya byk karakter (') yg dipakai. Apalagi kalau artikel ttg agama, misal ALqur'an atau bhs inggris. Bisa2 gagal terus input datanya. Gmn ya solusinya?

    BalasHapus
  3. Mungkin utk proses inputny di encoding terlebih dahulu lalu jika ingin di tampilkan baru di decoding. jadi data yg ada di database tetap dalam quote style. tp tergantung kreatifitas masing2 :D

    BalasHapus
  4. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  5. Gimana cara ya memfilter hasil komentar dari user?

    BalasHapus
  6. memfilter gimana maksudnya, filter untuk di tampilkan atau filter kata-kata yang tidak di gunakan ?

    BalasHapus