Injeksi SQL adalah masalah keamanan yang sangat serius, sebagian besar karena sangat mudah untuk mendapatkannya salah: cara yang jelas dan intuitif untuk membangun kueri yang memasukkan input pengguna membuat Anda rentan, dan Cara yang Benar untuk memitigasinya mengharuskan Anda untuk mengetahui tentang parameter pertanyaan dan injeksi SQL terlebih dahulu.
Tampak bagi saya bahwa cara yang jelas untuk memperbaikinya adalah dengan mematikan opsi yang jelas (tapi salah): perbaiki mesin basis data sehingga setiap kueri yang diterima yang menggunakan nilai-nilai yang dikodekan dalam klausa WHERE-nya alih-alih parameter mengembalikan parameter yang bagus, deskriptif pesan kesalahan yang memerintahkan Anda untuk menggunakan parameter sebagai gantinya. Ini jelas perlu memiliki opsi opt-out sehingga hal-hal seperti permintaan ad-hoc dari alat administratif akan tetap berjalan dengan mudah, tetapi harus diaktifkan secara default.
Memiliki ini akan mematikan injeksi SQL dingin, hampir semalam, tetapi sejauh yang saya tahu, tidak ada RDBMS yang benar-benar melakukan ini. Apakah ada alasan bagus mengapa tidak?
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;
"bad"
benar-benar literal atau hasil dari penggabungan string. Dua solusi yang saya lihat adalah menyingkirkan SQL dan DSL yang tersemat string lainnya (ya silakan), atau mempromosikan bahasa di mana penggabungan string lebih mengganggu daripada menggunakan kueri parameterisasi (umm, tidak).
bad_ideas_sql = 'SELECT title FROM idea WHERE idea.status == "bad" AND idea.user == :mwheeler'
akan memiliki nilai-nilai hard-kode dan parameter dalam satu permintaan - coba tangkap itu! Saya pikir ada kasus penggunaan yang valid untuk kueri campuran tersebut.