Cegah SQL Injection & XSS di Website

Kemarin-kemarin ini gw udah sempet ngebahas tentang cara ngelakuin SQL injection & XSS di website orang. Tapi nggak semua website orang bisa kena SQL injection & XSS. Nah, gimana caranya banyak website bisa kebal SQL injection & XSS? Berhubung SQL injection & XSS ini masalahnya dateng dari input yang dikirim user buat diproses, cara ngatasinnya ya kita harus ngefilter input dari user. Kalo ada input dari user yang ternyata perintah SQL buat ngelakuin SQL injection atau script untuk XSS, inputan itu harus diubah dulu jadi inputan teks biasa yang nggak berbahaya buat sistem.

Karena gw bikin website cuma bisa pake PHP (sebenernya dulu sempet pake ColdFusion waktu ngantor, tapi udah lama nggak pake terus lupa), gw kasih tau cara untuk ngefilter input dari user itu di PHP. Tapi di bahasa-bahasa lain juga seharusnya caranya nggak beda terlalu jauh sih.

Ngomong-ngomong di PHP versi 5.3 ada fitur yang namanya Magic Quotes yang kalo diaktifin udah otomatis bisa nangkal SQL injection, tapi fitur ini dihapus di PHP versi selanjutnya. Jadi gw nyaranin sih buat nangkal SQL injection kita pake function addslashes() aja.

Misalnya kita punya form inputan kayak begini di file input.php.

<form action="output.php" method="GET">
<input type="text" name="keyword">
<input type="submit" value="Search">
</form>

Nah, untuk pencegahan SQL injection kita bisa pake function addslashes() di file output.php sebelum input tadi dimasukin ke query database terus dieksekusi.

$keyword = addslashes($_GET['keyword']);

Kira-kira ini yang dilakuin sama function addslashes() ke string yang diinput user tadi.

$_GET['keyword'] = "' OR '1'='1--"; //sebelum addslashes()
$keyword = "\' OR \'1\'=\'1--"; //sesudah addslashes()

Function addslashes() tadi nambahin tanda backslash ke tanda kutip yang ada di string yang diinput user. Karena di query SQL tanda kutip yang ada sesudah tanda backslash dianggap bagian dari string, jadi string yang ada di variabel $keyword udah nggak berbahaya buat sistem. Yang dilakuin fitur Magic Quotes di PHP kira-kira sama dengan yang di atas ini juga kalo diaktifin sih. Tapi Magic Quotes ngelakuinnya otomatis waktu aktif, kalo addslashes() kita harus nambahin sendiri di program kapan stringnya mau dinetralin.

Untuk ngenetralin script XSS, ada beberapa function yang bisa dipake. Biasanya gw pake function htmlentities() buat ngelakuin ini.

$keyword = htmlentities($_GET['keyword']);

Kalo pake function htmlentities(), tag-tag HTML yang ada dalam string bakal dinetralin. Perubahan di stringnya bisa diliat di bawah.

$_GET['keyword'] = "<b>Hello</b>"; //sebelum htmlentities()
$keyword = "&lt;b&gt;Hello&lt;/b&gt;"; //sesudah htmlentities()

Kode ‘&lt;’ bakal ditampilin sebagai tanda ‘<‘ di web browser & tanda ‘&gt;’ bakal ditampilin sebagai tanda ‘>’. Tapi karena waktu halaman webnya dirender di browser kode ‘&lt;’ & ‘&gt;’ nggak dibaca sebagai tanda ‘<‘ & ‘>’, tag HTMLnya nggak bakalan berfungsi.

Bisa juga kita pake function strip_tags() untuk ngenetralin tag HTML. strip_tags ini gunanya buat ngapusin tag HTML yang ada dalam string yang kita input tadi. Misalnya begini.

$before = '<b>Hello, World!</b> <img src="tes.jpg">';
$after = strip_tags($before);

Nanti isi string di variabel $after jadi begini.

Hello, World!

Tag HTMLnya ilang semua kan? Tapi di function strip_tags() ini kita bisa ngasih inputan tag-tag HTML yang jadi pengecualian. Jadi tag-tag HTML ini nggak bakalan dihapus dari string yang ada.

$before = '<b>Hello, World!</b> <img src="tes.jpg">';
$after = strip_tags($before, '<b>');

Kalo dibuat begitu, isi string di variabel $after nanti jadi begini.

<b>Hello, World!</b>

Kita bisa masukin pengecualian buat lebih dari satu tag HTML di function strip_tags().

$before = '<b>Hello, World!</b> <img src="tes.jpg">';
$after = strip_tags($before, '<b><img>');

Kalo yang terakhir ini dijalanin, isi variabel $after jadi kayak begini.

<b>Hello, World!</b> <img src="tes.jpg">

Jadinya sama aja dengan isi variabel $before karena tag HTML yang ada di dalemnya semuanya dibolehin buat tetap ada.

Kalo buat nyegah XSS sih yang paling penting yang harus difilter itu tag <script> & <img>, soalnya dua tag ini bisa dipake buat ngeksekusi script. Tag <img> nggak cuma bisa masukin gambar ke website loh, script juga bisa. Tag <script> bisa dipake buat nyisipin script langsung ke dalam website target, sementara tag <img> bisa dipake buat manggil script yang disimpen di tempat lain buat dijalanin di website target.

One thought on “Cegah SQL Injection & XSS di Website

  1. Pingback: HTTPS, Aman di Jalan | Twisted Pair

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s