Seach

Algoritma dan teknik menangkal SQL injection

hacking
Tidak dipungkiri lagi, SQL injection adalah salah satu teknik hacking yg sangat berbahaya. Jika diamati, SQL injection berawal dari satu hal yg sebenarnya sangat sederhana sekali. Kali ini kita akan membahas teknik dan algoritma menangkal SQL injection yg dilakukan melalui methode $_GET.

Tulisan ini diawali kepada kesadaran bahwa atas banyaknya kasus SQL injection. Disamping sedikitnya kesadaran dari programmer dan kebingungan programmer untuk membenahi skripnya. Dikarenakan sedikitnya resource yg membahas bagaimana mencegah SQL injection. Sementara tips dan trik untuk melakukannya sangat banyak.

Mari kita lihat bersama: http://target.com/berita.php?task=detail&id=9
Pada kebanyakan aplikasi yg dibuat oleh programmer pemula, kode program pada berita.php adalah sebagai berikut

require_once(”connection.php”);
$sql = “SELECT * FROM berita WHERE id=”.$_GET['id'];
$result = mysql_query($sql);
while($data = mysql_fetch_array()){
     echo “

”.$data['judul'].”

”;
     echo “Posting pada tanggal: “.$data['tanggal_posting'];
     echo $data['isi'];
}
?>
Coba kita lihat lagi, betapa programmer, entah karena ketidak tahuan atau malas membenahi(nah ini yg susah) tidak memberikan filter pada input $_GET['id']. Padahal ini sangat berbahaya jika attacker mencoba melakukan teknik ini.

Disana ada 2 kesalahan fatal.
1. Tidak memberikan filter atas variable $_GET['id']. Sehingga MySQL Server akan memberikan signal kesalahan ke browser(Jika pada PHP error_message=ON).
2. Tidak melakukan checking terhadap hasil dari Query.

Lantas, bagaimana cara penanggulangannya. Cara mudahnya kita modifikasi skrip diatas seperti berikut ini:

require_once(”connection.php”);
// –> validasi $_GET['id']
if(!ctype_digit($_GET['id'])){
    die(””);
}
$sql = “SELECT * FROM berita WHERE id=”.$_GET['id'];
$result = mysql_query($sql);
// –> validasi hasil query
if(mysql_num_rows($result)<0){
    while($data = mysql_fetch_array()){
         echo “

”.$data['judul'].”

”;
         echo “Posting pada tanggal: “.$data['tanggal_posting'];
         echo $data['isi'];
    }
} else { echo “Berita tidak ditemukan.”; }
?>
Nah, skrip diatas kira-kira mempunyai arti algoritma seperti ini:
1. Pertama-tama, validasi $_GET['id'], jika ia bernilai Integer(angka), maka lanjutkan. Jika tidak, tampilkan peringatan “Jangan coba-coba ya.” dan kembali kehalaman selanjutnya.
2. Lakukan Query
3. Cek hasil query. Jika hasil lebih besar dari 0(1,2,dst), ambil hasil query dan tampilkan ke layar browser. Jika tidak tampilkan pesan “Berita tidak ditemukan.”.

Nah, dengan begitu aplikasi kita sudah lumayan aman. Tunggu terus kelanjutannya ya.

Catatan: algoritma ini bisa dipakai tidak hanya pada PHP saja, tetapi bisa untuk bahasa pemrograman web yg lain. Tentu saja dengan syntax masing-masing. Untuk database selain MySQL tinggal mencari fungsi yg sama atau setara dengan fungsi-fungsi MySQL

Tidak ada komentar:

Posting Komentar