"SQL Injection", merupakan satu teknik memasukkan kod ke dalam perisian pangkalan data yang seterusnya menjalankan arahan yang tidak sepatutnya dijalankan. "SQL Injection" ini akan menggunakan kelemahan sesuatu sistem laman web yang tidak menggunakan penapisan input yang sempurna sebelum arahan tersebut dijalankan sepenuhnya oleh pangkalan data.

Proses SQL Injection

Sekiranya anda biasa menggunakan arahan SQL mungkin contoh-contoh di bawah lebih senang difahami. Sekiranya anda masih baru, sila buat sedikit kajian mengenai SQL untuk menambahkan pemahaman anda. Pertama saya akan terangkan SQL Injection melalui penggunaan borang yang mana input yang dimasukkan ke dalam borang (field) tidak ditapis.

Katakan terdapat satu borang untuk memasukkan nama pengguna dalam satu "field" dan arahan SQL yang terlibat adalah seperti ini:

$arahan = "SELECT * FROM users WHERE name = ' " + nama_pengguna + " ' ; "

Arahan SQL di atas direka untuk mencapai maklumat dari pangkalan data yang lebih spesifik iaitu hanya melibatkan "table users" sahaja. Dan data di dalam "table" tersebut dihadkan capaiannya kepada "field name" yang bernilai "nama_pengguna". Pengondam akan masukkan arahan ini ke dalam borang:

parasolx' or 't'='t

ini akan melangkapkan arahan SQL yang sebelum ini sebagai:

$arahan = "SELECT * FROM users WHERE name = 'parasolx' OR 't'='t';"

Sekiranya arahan di atas melibat proses pengesahan contohnya seperti log masuk, arahan dibelakang 't'='t', memberikan fungsi "always true" yang mana proses pengesahan tersebut dapat di langkau tanpa perlu memasukkan kata laluan.

Sesetengah pelayar web (server) sekarang membolehkan kita menjalankan beberapa arahan SQL dengan serentak. Tetapi terdapat juga sesetengah arahan seperti mysql_query tidak membenarkannya atas segi keselamatan. Ini menghalang pengondam daripada memasukkan arahan palsu secara berterusan tetapi keadaan ini tidak menghalang daripada mereka mengubah suai arahan sedia ada. Contohnya, arahan ubah suai di bawah ini akan menyebabkan keseluruhan table users akan dibuang dan data-data berkaitan dengan parasolx (table data) juga turut dibuang:

parasolx'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%

ini akan melengkapkan arahan SQL:

$arahan = "SELECT * FROM users WHERE name = 'parasolx'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%';"

Penyalahtafsiran jenis arahan

Arahan kemasukan SQL ini akan berlaku apabila input yang disediakan tidak ditapis dan tidak ditetapkan jenis kemasukkannya. Pengondam akan memasukkan arahan bernombor ke dalam field dan SQL akan menjalankan arahan tersebut sekiranya webmaster tidak memeriksa arahan yang dimasukkan tidak sah sekiranya ia adalah arahan bukan bernombor. Contohnya:

$arahan = "SELECT * FROM data WHERE id = " + $id + ";"

Arahan tersebut sepatutnya hanya menerima input bernombor sahaja di bahagian $id. Tetapi pengondam akan memanipulasikan arahan input tersebut sekiranya tiada pengesahan input $id hanya sah sekiranya nombor sahaja. Sebagai contoh pengondam akan memasukkan arahan ini:

1; DROP TABLE users

ini akan membuang keseluruhan table users dari pangkalan data kerana arahan yang terhasil adalah:

$arahan = "SELECT * FROM data WHERE id = 1; DROP TABLE users;"

Proses menghalang SQL INJECTION

Untuk mengatasi proses SQL Injection ini, setiap input yang dibuat oleh setiap pengguna tidak seharusnya terus dijalankan oleh SQL. Sebaliknya setiap input yang dihantar perlu ditapis dan sekiranya tidak sah arahan tersebut perlu dibatalkan serta-merta.

Terdapat banyak cara untuk mengatasi SQL Injection dan salah satu tekniknya ialah "Escaping". Escaping bermaksud membatalkan sebarang arahan yang tidak sah dijalankan melalui arahan SQL. Dalam PHP, sebagai contohnya, proses pembatalan arahan biasanya dilakukan dengan menggunakan fungsi mysql_real_escape_string sebelum dijalankan sepenuhnya oleh SQL:

$query = sprintf("SELECT * FROM users WHERE userName='%s' AND password='%s'",
                  mysql_real_escape_string($username),
                  mysql_real_escape_string($password));
mysql_query($query);

Contoh di bawah ini pula akan menapis sebarang penggunaan aksara yang boleh menyebabkan arahan palsu dijalankan:

<?php
$title = $_POST['title']; // input data dari pengguna
$description = $_POST['description']; // input data dari pengguna
 
// proses penapisan
 
$dirtystuff = array("\"", "\\", "/", "*", "'", "=", "-", "#", ";", "<", ">", "+", "%");
 
// membersihkan input data pengguna (sekiranya data yang dihantar mengandungi aksara-aksara yang tersenarai seperti di atas, maka ianya akan  dibuang)
 
$title = str_replace($dirtystuff, "", $title); // dibersihkan
$description = str_replace($dirtystuff, "", $description); // dibersihkan
 
// input: Sa/ya s'uk"a be<ra**da d/i Kri#p;+korn Stu>d/i%os*** // output: Saya suka berada di Kripkorn Studios   // input: a';DROP TABLE users; SELECT * FROM data WHERE name LIKE '% // output: aDROP TABLE users SELECT FROM data WHERE name LIKE 
 
?>

Dalam artikel ini, saya hanya tunjukkan beberapa contoh jenis SQL Injection dan cara-cara dan langkah-langkah untuk mengatasi daripada arahan SQL yang palsu dijalankan. Terdapat banyak lagi langkah-langkahnya. Anda mungkin boleh membuat rujukan sendiri dan apa salahnya berkongsi dengan saya.

Artikel: 
Penilaian: 
5
Your rating: None Average: 5 (2 votes)

Komen

saifulfaizan's picture

macam mana dengan cara R.F.I (Read file Conclusion ) boleh bagi tips ckit banyak site sekarang nie dah x vulner dengan sqli dan exploit.....("script kiddies power than tools")

parasolx's picture
Admin

Sebenarnya bukan "read file conclusion" tetapi "remote file inclusion, (RFI)".. boleh baca artikel tuh di sini:

http://kripkornstudios.com.my/remote-file-inclusion-rfi

------

Hadafi Solution & Resources: http://parasolx.net
Professional in Drupal web development, theme designing, consultation and training