Idenya sangat sederhana - permintaan dan data dikirim ke server database secara terpisah .
Itu saja.
Akar masalah injeksi SQL adalah dalam pencampuran kode dan data.
Faktanya, permintaan SQL kami adalah program yang sah . Dan kami membuat program semacam itu secara dinamis, menambahkan beberapa data dengan cepat. Dengan demikian, data dapat mengganggu kode program dan bahkan mengubahnya, karena setiap contoh injeksi SQL menunjukkannya (semua contoh dalam PHP / Mysql):
$expected_data = 1;
$query = "SELECT * FROM users where id=$expected_data";
akan menghasilkan permintaan reguler
SELECT * FROM users where id=1
sementara kode ini
$spoiled_data = "1; DROP TABLE users;"
$query = "SELECT * FROM users where id=$spoiled_data";
akan menghasilkan urutan berbahaya
SELECT * FROM users where id=1; DROP TABLE users;
Ini berfungsi karena kita menambahkan data secara langsung ke badan program dan itu menjadi bagian dari program, sehingga data dapat mengubah program, dan tergantung pada data yang dikirimkan, kita akan memiliki output reguler atau tabel users
dihapus.
Sementara dalam hal pernyataan yang disiapkan kami tidak mengubah program kami, itu tetap utuh
Itulah intinya.
Kami mengirim program ke server terlebih dahulu
$db->prepare("SELECT * FROM users where id=?");
di mana data diganti oleh beberapa variabel yang disebut parameter atau placeholder.
Perhatikan bahwa permintaan yang sama persis dikirimkan ke server, tanpa ada data di dalamnya! Dan kemudian kami mengirimkan data dengan permintaan kedua , yang pada dasarnya dipisahkan dari permintaan itu sendiri:
$db->execute($data);
jadi itu tidak dapat mengubah program kami dan membahayakan.
Cukup sederhana - bukan?
Satu-satunya hal yang harus saya tambahkan adalah selalu dihilangkan dalam setiap manual:
Pernyataan yang disiapkan hanya dapat melindungi literal data , tetapi tidak dapat digunakan dengan bagian kueri lainnya.
Jadi, begitu kita harus menambahkan, katakanlah, pengidentifikasi dinamis - nama bidang, misalnya - pernyataan yang disiapkan tidak dapat membantu kita. Saya sudah menjelaskan masalah ini baru-baru ini , jadi saya tidak akan mengulangi lagi.