DDOS,Defacing,Steal Information atau banyak kasus lainnya,mungkin semakin marak terjadi pada saat ini dan penyebab kasus seperti ini terjadi salah satunya ialah di karenakan lemahnya suatu pertahanan system/aplication yang telah kita buat.
Oleh karna itu, disini saya akan sedikit sharing bagaimana cara mencegah suatu system/aplication yang telah kita buat terhadap serangan peretas. Terutama pada system "Web Application" yaitu Bagaimana Mencegah Serangan SQL Injection.
Oke langsung saja kita ambil suatu contoh web yang menampilkan tentang berita, seperti contoh dibawah ini :
Dimana saya menampilkan berita tersebut dengan perulangan while. kurang lebih kodingan yang saya buat seperti dibawah ini :
  1. $q_list = "select id_berita,judul_berita from berita ORDER BY id_berita ASC";
  2. $hasil_q_list = mysql_query($q_list);
  3. while($tampil = mysql_fetch_array($hasil_q_list))
  4.     {
  5.         $judul = $tampil['judul_berita'];
  6.         $id = $tampil['id_berita'];
  7.         echo '<a href="berita.php?id='.$id.'">'.$judul.'</a>';
  8.         echo '<hr>';
  9.     }
Jika dilihat didalam kodingan tersebut tidak ada yang berbahaya,dikarena tidak terdapat input-an terhadap query di database Line 1. Tetapi coba kita lihat pada Line 7,disana saya menggunakan hyperlink untuk membaca berita secara lengkap dengan memanggil variabel $id pada parameter id. sekarang coba kita periksa apakah sebenarnya variabel $id pada hyperlink tersebut.
Kita lihat ternyata variabel $id tersebut ialah sebuah angka, sekarang kita coba bongkar kodingan dibalik variabel $id tersebut ini.
  1. else if (isset($_GET['id']))
  2. {
  3.     $id = $_GET['id'];
  4.     $q_berita_lengkap = "select * from berita where id_berita='$id'";
  5.     $hasil_get = mysql_fetch_array(mysql_query($q_berita_lengkap));
  6.     echo '<h2>'.$hasil_get['judul_berita'].'</h2>';
  7.     echo '<p>'.$hasil_get['isi_berita'].'</p>';
  8.     echo (mysql_error());
  9. }
Skarang kita coba fokus pada Line 4, disana kita lihat bahwa penggunaan query yang di tempatkan pada variabel $q_berita_lengkap terdapat suatu inputkan dari variabel $id melalui metode GET (Line 3). Dan ini tidak menutup kemungkinan bisa terjadi pengubahan value pada query melalui metode GET tersebut. Baik sekarang kita coba mulai dengan memberikan karakter (') setelah angka 1 pada parameter sebelumnya. Contoh sebelumnya kita menampilkan berita dengan url http://localhost/web/berita.php?id=1 sekarang kita coba ubah menjadi http://localhost/web/berita.php?id=1'.
Sesudah disisipkan sebuah karakter (') setelah angka id, hasilnya ternyata terjadi error pada query dan inilah asal mula terjadinya SQL Injection seorang peretas untuk melihat isi database kita. Untuk membuktikan bahwa ini benar-benar bug yang cukup berbahaya, sebagai contoh saya akan memberikan sedikit bagaimana cara melihat version database,user database, nama database melalui SQL Injection.
Version Database
User Database
Nama Database
Kelihatannya memang cukup berbahaya, tetapi disini saya tidak akan menjelaskan bagaimana cara melakukan SQL Injection melainkan bagaimana melakukan perbaikan pada celah yang terjadi. Baik sekarang kita coba fokus kembali ke bagian script sebelumnya yaitu dimana pemanggilan metode GET pada parameter id terjadi.
  1. else if (isset($_GET['id']))
  2. {
  3.     $id = $_GET['id'];
  4.     $q_berita_lengkap = "select * from berita where id_berita='$id'";
  5.     $hasil_get = mysql_fetch_array(mysql_query($q_berita_lengkap));
  6.     echo '<h2>'.$hasil_get['judul_berita'].'</h2>';
  7.     echo '<p>'.$hasil_get['isi_berita'].'</p>';
  8.     echo (mysql_error());
  9. }
Ya, inilah script yang menjadi inti dari masalah kita,sekarang coba kita lihat pada Line 3 & Line 4. Disana kita lihat tidak terdapat filterisasi inputan pada metode GET,sehingga siapapun dapat menyisipkan karakter apapun pada query yang menuju ke database tanpa di saring terlebih dahulu. Oke,jika kita sudah mengetahui dimana letak masalahnya,sekarang kita coba melakukan filterisasi input-an pada metode GET dengan function yang terdapat pada php yaitu mysql_real_escape_string. Apa itu mysql_real_escape_string? sedikit yang saya tahu ialah fungsi yang di gunakan untuk menfilterisasi sebuah input-an yang dapat membuat suatu query error lalu mengubahnya sebagai query comment agar pada saat diproses di database tidak terbaca sebagai inputan yang dapat berbahaya.
Sedikit Contoh :
Misalkan kita mencoba inputkan karakter ('),maka fungsi mysql_real_escape_string akan mengubah karakter itu menjadi (\') tetapi untuk lebih jelasnya bisa kalian baca di php.net.
Baik sekarang kita coba sisipkan fungsi mysql_real_escape_string pada metode GET tersebut,dimana :
$id = $_GET['id'];
Diubah Menjadi
$id = mysql_real_escape_string($_GET['id']);

  1. else if (isset($_GET['id']))
  2. {
  3.     $id = mysql_real_escape_string($_GET['id']);
  4.     $q_berita_lengkap = "select * from berita where id_berita='$id'";
  5.     $hasil_get = mysql_fetch_array(mysql_query($q_berita_lengkap));
  6.     echo '<h2>'.$hasil_get['judul_berita'].'</h2>';
  7.     echo '<p>'.$hasil_get['isi_berita'].'</p>';
  8.     echo (mysql_error());
  9. }
Baik setelah kita menyisipkan fungsi mysql_real_escape_string,kita coba kembali untuk menginjeksi/menyisipkan karakter (') pada metode GET. Apakah kita akan mendapati error kembali?
Lihat,Sesudah kita melakukan filterisasi pada metode GET tersebut ternyata tidak terdapat error lagi. Yang artinya kita berhasil melakukan penyaringan inputan yang di berikan melalui metode GET.
Catatan : Metode ini juga berlaku pada metode POST ataupun REQUEST

Sebagai Tambahan :

Sebelum menutup tutorial ini saya hanya ingin sedikit mengingatkan tentang penulisan code pada penyisipan variabel $id (contoh kasus disini).
  1. else if (isset($_GET['id']))
  2. {
  3.     $id = mysql_real_escape_string($_GET['id']);
  4.     $q_berita_lengkap = "select * from berita where id_berita='$id'";
  5.     $hasil_get = mysql_fetch_array(mysql_query($q_berita_lengkap));
  6.     echo '<h2>'.$hasil_get['judul_berita'].'</h2>';
  7.     echo '<p>'.$hasil_get['isi_berita'].'</p>';
  8.     echo (mysql_error());
  9. }
Yup, pada Line 4 yaitu :
$q_berita_lengkap = "select * from berita where id_berita='$id'";
kita lihat pada variabel $id,disana saya menyisipkan variabel $id dan mengapitnya diantara kutip ('). Ini penting untuk mengapit variabel tersebut. Jika tidak,maka fungsi mysql_real_escape_string tidak akan bekerja secara sempurna. Dikarenakan dimana mysql_real_escape_string yang ditugaskan untuk mengubah karakter berbahaya menjadi karakter yang tidak berbahaya, akan menjadi karakter yang berbahaya pada sisi backend.
Contoh :
Saya akan mencoba mengubah script pada metode GET tersebut menjadi :
  1. else if (isset($_GET['id']))
  2. {
  3.     $id = mysql_real_escape_string($_GET['id']);
  4.     $q_berita_lengkap = "select * from berita where id_berita=$id";
  5.     $hasil_get = mysql_fetch_array(mysql_query($q_berita_lengkap));
  6.     echo '<h2>'.$hasil_get['judul_berita'].'</h2>';
  7.     echo '<p>'.$hasil_get['isi_berita'].'</p>';
  8.     echo (mysql_error());
  9. }
Sekarang pada Line 4 kita tidak berikan pengampit,coba kita injeksi :
Kita lihat, pengubahan karakter (') bukannya menjadi filter yang baik tetapi sebaliknya,ia akan membuat query menjadi error. Hal ini dapat terjadi dikarenakan ketika karakter tersebut berubah menjadi (\'), Pada sisi backend query tersebut menjadi query yang tidak valid.
Berikut saya demokan hasil query langsung pada SQL Command agar lebih jelas :
Pada gambar dibawah ini comment tidak terbaca oleh mysql dikarenakan di bagian depan value dan di belakang comment tidak terdapat penutup. jadi karakter (\') yang seharusnya menjadi comment tetapi menjadi penutup yang tidak baik :(

Tetapi sebaliknya jika diberikan penutup,maka comment karakter (\') akan menjadi comment yang sangat baik :)
Untuk source lengkapnya bisa kalian download disini
Baik,mungkin sampai sini dulu tutorial singkat ini,sampai bertemu di tutorial yang berikutnya ^_^.