SQL Injection dan pencegahanya

SQL injection itu penyerangan untuk dapat mengakses database server dengan memasukan query baik melalui field atau URL yang akan menyebabkan database server meng-generate query SQL yang tidak valid. Ini mudah terjadi karena sebenarnya difasilitasi oleh kode program itu sendiri.

Kalau menurut Masku , ini adalah salah satu teknik paling mudah yang sering digunakan untuk masuk ke database sasaran. Meskipun ini dapat dicegah jika kode program kita tervalidasi dengan baik. Sebenarnya apa bila anda teliti,teknik SQL injection sangat sederhana sekali. Akan tetapi
justru yang sering diabaikan oleh para programer,entah itu tidak tahu atau lupa.

Berikut ini beberapa contoh teknik SQL injection,implementasi,dan cara menggagalkan nya.

  • Single Injection
Contoh : Awalnya kita mempunyai kode seperti ini:

$match = false;
if (isset($_POST['submit'])) {
$nama = $_POST['nama'];
$pass = $_POST['pass'];
$sql = "SELECT nama, password FROM user WHERE
nama='$nama' AND password='$pass'";
$res = mysqli_query($db, $sql);
// jika res berhasil,dan row yang
// dikembalikan=1, set $match=true
if ($res && mysqli_query_rows($res) == 1) {
$match = true ;
mysqli_free_result($res);
}
if ($match === true) {
echo 'account match';
} else {
echo 'invalid account';
}
}



kode ini sangatlah rapuh meskipun kelihatanya melakukan verivikasi data. Bila kita ingin melakukan penyerangan kita bisa menggunakan query-query seperti dibawah ini:

// mengisi field nama saja,# adalah komentar,
// yang akan mengabaikan baris setelahnya
admin'#

// mengisi nama field saja
// mengekstrak data kelokasi tertentu
'OR' 1=1 INTO DUMPFILE '/path/ke_lokasi/file.txt '#
'OR' 1=1 INTO OUTFILE '/path/ke_lokasi/file.txt '#



Ini adalah contoh yang sangat umum. Untuk mencegahnya kita dapat menggunakan fungsi mysql_real_escape_string () atau addslashes()

$nama = myMacig($_POST['nama']};
$pass = myMacig($_POST['pass']};

  • Multiple Injection
Contoh SQL injection lainnya adalah dengan memberikan multiple query,seperti berikut:
// $id dari method GET/POST
$sql = "SELECT * FROM buku WHERE kode='{$id}’ “;
//mengahapus isi table
0; DELETE FROM user
// membuat account baru
0; GRANT ALL ON *.* TO 'xxx@%'

Dalam kasus ini,macig quote akan mengabaikan tanda titik koma,ini sangat membahayakan
jika menggunakan SQLite atau postgreSQL. Adapun solusi nya adalah menggunakan operator
casting untuk memastikan bahwa id harus integer.

//Simulasi nilai $_POST['id']
0; DELETE FROM user
$id = (int) myMacig($_POST['id']);




Cara pencegahan yang umum digunakan :
1. Batasi panjang input box (jika memungkinkan), dengan
cara membatasinya di kode program, jadi si cracker pemula
akan bingung sejenak melihat input box nya gak bisa di
inject dengan perintah yang panjang.
2. Filter input yang dimasukkan oleh user, terutama penggunaan
tanda kutip tunggal (Input Validation).
3. Matikan atau sembunyikan pesan-pesan error yang keluar
dari SQL Server yang berjalan.
4. Matikan fasilitas-fasilitas standar seperti Stored Procedures,
Extended Stored Procedures jika memungkinkan.
5. Ubah "Startup and run SQL Server" menggunakan low privilege user
di SQL Server Security tab.



Referensi :

Securtionline, Amikom, Mas

07.11.0385

, ,