Ini bukan apa itu SQL Injection. Setiap kali Anda menggunakan parameter yang belum disanitasi dalam kueri SQL, Anda membiarkan database terbuka untuk injeksi SQL, yang mungkin tidak selalu bertujuan untuk menghancurkan data. Bisa juga untuk mencuri data atau mendapatkan akses tidak sah.
Pertimbangkan akun yang sangat terbatas di mana yang bisa dilakukannya hanyalah SELECT
. Anda menulis kueri untuk otentikasi:
$sql = "SELECT COUNT(*) AS count
FROM users
WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";
// check if returns a count of 1, if yes, log in
Dengan input normal, Anda mengharapkan kueri terlihat seperti:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
Yang harus mengembalikan 1 sebagai hitungan jika nama pengguna dan pass cocok. Sekarang penyerang mencoba masuk sebagai admin. Karena Anda belum membersihkan input Anda, mereka mengirim $_POST['user']
sebagai:admin'; --
. Seluruh kueri menjadi:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
Semuanya setelah --
adalah komentar, jadi ini mengabaikan kondisi lain dan mengembalikan 1 terlepas. Ini dia, Anda baru saja memberikan akses admin pengguna yang jahat. Begitulah cara beberapa serangan nyata dilakukan. Anda mulai dengan akun dengan hak istimewa rendah dan melalui celah keamanan Anda mencoba mendapatkan akses ke lebih banyak hak istimewa.
Singkat cerita, memiliki akun seluruh aplikasi dengan hak istimewa terbatas (mis:tanpa DROP
, ALTER
, dll) baik. Jangan pernah memberi siapa pun atau aplikasi apa pun hak istimewa lebih dari yang mereka butuhkan. Tetapi untuk mencegah injeksi SQL, gunakan pernyataan yang disiapkan
.