Pada tulisan saya kali ini saya memilih untuk topik SQL Injection, karena belakangan ini banyak skali pemberitaan di media tentang pembobolan website-website pemerintahan yang saya pikir semuanya melewati bugs SQL Injection yang sangat fenomenal ini.
Kali ini kita akan membahas teknik dan algoritma menangkal SQL injection yg dilakukan melalui methode $_GET.
Mari kita lihat bersama: http://target.com/berita.php?content=detail&id=1
Pada umumnya aplikasi yg dibuat oleh programmer pemula, kode program pada berita.php adalah sebagai berikut
Source Code include ”connect.inc.php”; $sql = “SELECT * FROM berita WHERE id=”.$_GET['id'];$result = mysql_query($sql); while($news = mysql_fetch_array()) { echo “$news['title']”; echo “Posting pada tanggal: “.$news['tanggal_posting']; echo $news['content']; } ?>
Pada contoh Code diatas, terlihat bahwa sang Programmer tidak memberikan filter pada input $_GET['id']. Padahal ini sangat berbahaya jika penyusup mencoba melakukan teknik ini.
Dalam Source Code diatas, terdapat 2 kesalahan fatal :
- Tidak memberikan filter atas variable $_GET['id']. Sehingga MySQL Server akan memberikan signal kesalahan ke browser(Jika pada PHP error_message=ON).
- Tidak melakukan checking terhadap hasil dari Query.
Lalu, bagaimana cara penanggulangannya. Cara mudahnya kita modifikasi Source Code diatas seperti berikut ini:
Source Code include "connect.inc.php"; //Filter $_GET['id'] if(!ctype_digit($_GET['id'])){ die(”<!-- // ”); } $sql = “SELECT * FROM berita WHERE id=”.$_GET['id']; $result = mysql_query($sql); // –> Filter hasil query if(mysql_num_rows($result)<0){ while($news = mysql_fetch_array()){ echo "$news['title']"; echo “Posting pada tanggal: “.$news['tanggal_posting']; echo $news['content']; } } else { echo “Maaf, Berita tidak ditemukan.”; } ?>
Maksud dari Modifikasi Source Code diatas :
1. Pada Filter $_GET['id'], jika ia bernilai Integer(angka), maka proses query dilanjutkan oleh MySQL. Jika tidak, maka akan di tampilkan Alert “SQL Injection Detected.” dan kembali kehalaman selanjutnya.