Dalam pengembangan aplikasi berbasis web dengan menggunakan PHP kerapkali kita menggunakan koneksi menggunakan database. Dalam menghubungkannya kita menuliskan perintah koneksi menggunakan query dan perintah lainnya dalam query pula tentunya. Tapi terkadang tanpa disadari rentannya suatu situs diakibatkan penggunaan query yang tidak menggunakan keamanan yang baik. Kerentanan pada query salah satunya dengan melakukan injeksi pada query di dalam source code.
Dikarenakan query yang dilewatkan oleh PHP ke database MySQL ditulis layaknya SQL, maka melakukan kemungkinan resiko untuk orang lain melakukan injeksi SQL menggunakan parameter di MySQL dikenal sebagai SQL injection. Dengan memasukkan malicious code melalui parameter di form, maka kemungkinan bagi attacker mematahkan keamanan server Anda.
Mari katakan Anda memiliki parameter form dengan nama variabel $barang, dan Anda memiliki SQL seperti ini :
$SQL = “SELECT * FROM tbl_barang WHERE barang = ‘$barang'”;
Jika parameter tersebut berasal langsung dari form, maka gunakanlah pada database untuk menangani escapes dengan fungsi bawaan dari PHP, seperti ini :
$SQL = “SELECT * FROM tbl_barang WHERE barang = ‘” ‘
mysql_real_escape_string($barang) . ‘ ” ‘;
Karena jika tidak maka seseorang mungkin saja memasukkan parameter seperti di bawah ini melalui form :
39’; DROP tbl_barang; SELECT ‘FOO
Sehingga hasilnya pada $SQL Anda akan menjadi seperti ini :
SELECT * FROM tbl_barang WHERE barang = ’39’; DROP tbl_barang; SELECT ‘FOO’
Dikarenakan semicolon pada MySQL merupakan pemisah, maka pada database akan terlihat seperti ini :
SELECT * FROM tbl_barang WHERE barang = ’39’
DROP tbl_barang
SELECT ‘FOO’
Begitulah jadinya.
Untuk menghindari penyerangan melalui SQL Injection, lakukan dua hal :
- Selalu melakukan validasi semua parameter. Seperti contoh, jika memang paramter yang dibutuhkan merupakan angka, maka pasti bahwa parameter tersebut memang angka.
- Selalu gunakan fungsi mysql_real_escape_string() pada data untuk melewatkan atau menentukan tanda kutip satu (quote) atau kutip dua (double quote) pada data Anda.
Untuk mengurangi kemungkinan MySQL melakukan hal-hal yang tidak diinginkan, maka perketatlah hak user pada MySQL. Penentuan terhadap user account untuk melakukan hal-hal tertentu saja, dan juga pada tabel-tabel tertentu. Misalnya, Anda membuat pengguna pada MySQL yang hanya bisa melakukan select pada tabel tertentu dan hal yang lain tidak bisa. Tapi mungkin tidak akan terlalu berguna jika Anda memiliki data yang dinamik, kecuali Anda memiliki informasi pengunjung yang sangat sensitif, ini memungkinkan untuk orang lain menginginkan akses yang tidak diperlihatkan.