Injeksi SQL (SQL Injection) adalah sebuah teknik yang menyalahgunakan sebuah celah keamanan yang terjadi dalam lapisan database sebuah aplikasi. Celah ini terjadi ketika masukan data dari pengguna tidak disaring secara benar dari karakter-karakter pelolos bentukan string yang diimbuhkan dalam SQL atau masukan pengguna tidak bertipe kuat dan karenanya waktu dijalankan tidak sesuai dengan harapan.
Bentuk-bentuk celah keamanan SQL Injection
Bentuk SQL Injection ini terjadi ketika masukan dari pengguna tidak disaring dari karakter-karakter pelolos dan kemudian diteruskan ke dalam sebuah pernyataan SQL. Ini menimbulkan potensi untuk memanipulasi pernyataan-pernyataan yang dilakukan pada database oleh pengguna.
Contoh celah keamanan SQL Injection:
Secara teori, perintah SQL sah apapun bisa diinjeksi melalui metode ini, termasuk menjalankan banyak pernyataan. Nilai "username" pada pernyataan di bawah ini akan menyebabkan dihapusnya tabel "tb_users" dan juga pengambilan semua data dari tabel "tb_data":
Bentuk SQL Injection ini terjadi ketika sebuah unsur masukan dari pengguna tidak bertipe kuat atau tidak diperiksa batasan-batasan tipenya. Ini dapat terjadi ketika sebuah unsur numerik akan digunakan dalam sebuah pernyataan SQL, tetapi develop tidak melakukan pemeriksaan untuk memastikan bahwa masukan pengguna adalah numerik. Sebagai contoh:
Sumber : wikipedia.org
pernyataan := "select * from tb_users where username = '" + username +"';"Jika variabel "username" dirangkai sedemikian rupa oleh pengguna yang bermaksud buruk, pernyataan SQL tersebut bisa melakukan lebih daripada yang develop maksudkan. Sebagai contoh, mengatur variabel "username" sebagai
a' or 't' = 'tMenjadikan pernyataan SQL ini:
SELECT * FROM tb_users WHERE username = 'a' or 't'='t';Jika kode ini akan digunakan dalam sebuah prosedur untuk melakukan otentikasi, maka contoh ini dapat dipakai untuk memaksakan pemilihan sebuah nama pengguna yang sah karena evaluasi 't'='t' akan selalu bernilai benar.
Secara teori, perintah SQL sah apapun bisa diinjeksi melalui metode ini, termasuk menjalankan banyak pernyataan. Nilai "username" pada pernyataan di bawah ini akan menyebabkan dihapusnya tabel "tb_users" dan juga pengambilan semua data dari tabel "tb_data":
a'; DROP TABLE tb_users; SELECT * FROM tb_data WHERE username LIKE '%Masukan ini menjadikan pernyataan SQL sebagai berikut:
SELECT * FROM tb_users WHERE username = 'a'; DROP TABLE tb_users; SELECT * FROM tb_data WHERE username LIKE '%';Penanganan tipe yang tidak benar
Bentuk SQL Injection ini terjadi ketika sebuah unsur masukan dari pengguna tidak bertipe kuat atau tidak diperiksa batasan-batasan tipenya. Ini dapat terjadi ketika sebuah unsur numerik akan digunakan dalam sebuah pernyataan SQL, tetapi develop tidak melakukan pemeriksaan untuk memastikan bahwa masukan pengguna adalah numerik. Sebagai contoh:
pernyataan := "SELECT * FROM tb_data WHERE id = " + variabel_a + ";"Terlihat jelas dari pernyataan ini develop memaksudkan variabel_a menjadi sebuah nomor yang berhubungan dengan unsur "id". Namun, jika pada kenyataannya itu adalah sebuah string, maka pengguna terakhir dapat memanipulasi pernyataan tersebut sesukanya, dan karena itu mengabaikan kebutuhan akan karakter-karakter pelolos. Sebagai contoh, mengeset variabel_a sebagai
1; DROP TABLE tb_usersAkan menghapus tabel "tb_users" dari database karena hasil akhir SQL-nya akan menjadi sebagai berikut:
SELECT * FROM tb_data WHERE id = 1; DROP TABLE tb_users;Terkadang celah-celah keamanan dapat berada dalam perangkat lunak server database itu sendiri, seperti yang terjadi pada fungsi-fungsi
real_escape_chars()
di server MySQL.
Sumber : wikipedia.org