Menggunakan parameter terikat sudah cukup dalam kasus umum, dan praktik yang baik untuk menghindari injeksi SQL.
Tetapi parameter dalam pernyataan yang disiapkan hanya dapat digunakan untuk nilai dalam ekspresi SQL. Dengan kata lain, di mana Anda biasanya akan menulis literal string yang dikutip, literal tanggal yang dikutip, atau literal numerik. Dan satu parameter ==satu nilai (tidak ada daftar).
Anda harus menggunakan parameter terikat untuk kasus tersebut. Jika Anda mengajukan pertanyaan ini karena Anda pikir Anda mungkin ingin melewati penggunaan parameter terikat jika seseorang menjawab bahwa itu tidak cukup, maka maaf, Anda tidak akan dibebaskan dari praktik pemrograman yang aman.
Namun, ada kasus lain (mungkin kurang umum) di mana parameter terikat tidak berfungsi. Jika Anda perlu menulis kueri dengan nama tabel dinamis, nama kolom, atau pengenal lain, atau seluruh ekspresi, atau kata kunci SQL, maka Anda memerlukan metode lain. Kasus-kasus ini harus diperbaiki dalam sintaks SQL di prepare waktu, sehingga tidak dapat diparameterisasi.
Misalnya, inilah kueri dengan bagian dinamis yang dilambangkan dengan penggunaan variabel, yang tidak dapat berupa parameter:
$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";
Anda harus menggunakan daftar putih untuk kasus tersebut . Dengan kata lain, pastikan bahwa string yang Anda interpolasi ke dalam kueri Anda sebagai nama tabel dinamis sebenarnya adalah salah satu tabel yang ada di database Anda. Pastikan kata kunci SQL adalah kata kunci yang sah.
Tidak pernah ambil input pengguna kata demi kata dan interpolasi ke dalam SQL (atau kode lain apa pun yang diuraikan saat runtime, seperti argumen yang Anda masukkan ke eval()
atau shellexec()
). Dan bukan hanya masukan pengguna yang bisa menjadi konten yang tidak aman.
Lihat juga presentasi saya Mitos dan Kekeliruan Injeksi SQL untuk penjelasan lebih lanjut.