Cara saya melihatnya, serangan injeksi SQL dapat dicegah dengan:
- Menyaring, memfilter, menyandikan input dengan hati-hati (sebelum dimasukkan ke dalam SQL)
- Menggunakan pernyataan / kueri parameter yang disiapkan
Saya kira ada pro dan kontra untuk masing-masing, tetapi mengapa # 2 lepas landas dan dianggap lebih atau kurang cara de facto untuk mencegah serangan injeksi? Apakah hanya lebih aman dan kurang rentan terhadap kesalahan atau ada faktor lain?
Seperti yang saya mengerti, jika # 1 digunakan dengan benar dan semua peringatan diurus, itu bisa sama efektifnya dengan # 2.
Sanitasi, Penyaringan, dan Pengkodean
Ada beberapa kebingungan di antara saya tentang apa arti sanitasi , penyaringan , dan pengodean . Saya akan mengatakan bahwa untuk tujuan saya, semua hal di atas dapat dipertimbangkan untuk opsi 1. Dalam hal ini saya mengerti bahwa sanitasi dan penyaringan memiliki potensi untuk memodifikasi atau membuang data input, sementara penyandian mempertahankan data apa adanya , tetapi menyandikannya benar untuk menghindari serangan injeksi. Saya percaya bahwa melarikan diri data dapat dianggap sebagai cara penyandian data.
Kueri Parameterisasi vs Perpustakaan Pengkodean
Ada jawaban di mana konsep parameterized queries
dan encoding libraries
diperlakukan secara bergantian. Koreksi saya jika saya salah, tetapi saya mendapat kesan bahwa mereka berbeda.
Pemahaman saya adalah bahwa encoding libraries
, tidak peduli seberapa baik mereka selalu memiliki potensi untuk memodifikasi SQL "Program", karena mereka membuat perubahan pada SQL itu sendiri, sebelum dikirim ke RDBMS.
Parameterized queries
di sisi lain, kirim program SQL ke RDBMS, yang kemudian mengoptimalkan kueri, menentukan rencana eksekusi kueri, memilih indeks yang akan digunakan, dll., dan kemudian memasukkan data, sebagai langkah terakhir di dalam RDBMS diri.
Perpustakaan Pengkodean
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
Permintaan Parameter
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
Signifikansi Historis
Beberapa jawaban menyebutkan bahwa secara historis, kueri parameterisasi (PQ) dibuat karena alasan kinerja, dan sebelum serangan injeksi yang menargetkan masalah pengodean menjadi populer. Pada titik tertentu menjadi jelas bahwa PQ juga cukup efektif terhadap serangan injeksi. Untuk menjaga semangat pertanyaan saya, mengapa PQ tetap menjadi metode pilihan dan mengapa metode ini berkembang di atas sebagian besar metode lain dalam hal mencegah serangan injeksi SQL?