Per come la vedo io, gli attacchi SQL injection possono essere prevenuti:
- Screening, filtraggio, codifica dell'input con attenzione (prima dell'inserimento in SQL)
- Utilizzo di istruzioni preparate / query con parametri
Suppongo che ci siano pro e contro per ciascuno, ma perché il n. 2 è decollato e considerato più o meno il modo di fatto per prevenire gli attacchi di iniezione? È solo più sicuro e meno soggetto a errori o c'erano altri fattori?
A quanto ho capito, se il n. 1 viene usato correttamente e vengono prese in considerazione tutte le avvertenze, può essere altrettanto efficace del n. 2.
Disinfezione, filtraggio e codifica
C'era un po 'di confusione tra il mio significato di sanificazione , filtraggio e codifica . Dirò che per i miei scopi, tutto quanto sopra può essere considerato per l'opzione 1. In questo caso capisco che la sanificazione e il filtro hanno il potenziale per modificare o scartare i dati di input, mentre la codifica conserva i dati così come sono , ma li codifica correttamente per evitare attacchi di iniezione. Credo che la fuga di dati possa essere considerata come un modo per codificarli.
Query con parametri vs Libreria di codifica
Ci sono risposte in cui i concetti di parameterized queries
e encoding libraries
che sono trattati in modo intercambiabile. Correggimi se sbaglio, ma ho l'impressione che siano diversi.
La mia comprensione è che encoding libraries
, indipendentemente dal fatto che siano sempre in grado di modificare il "Programma" SQL, perché stanno apportando modifiche allo stesso SQL, prima che venga inviato a RDBMS.
Parameterized queries
dall'altro lato, inviare il programma SQL a RDBMS, che quindi ottimizza la query, definisce il piano di esecuzione della query, seleziona gli indici da utilizzare, ecc., quindi collega i dati, come l'ultimo passaggio all'interno di RDBMS si.
Libreria di codifica
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
Query con parametri
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
Significato storico
Alcune risposte affermano che storicamente, le query con parametri (PQ) sono state create per motivi di prestazioni e prima che gli attacchi di iniezione mirati ai problemi di codifica diventassero popolari. Ad un certo punto è diventato evidente che i PQ erano anche abbastanza efficaci contro gli attacchi di iniezione. Per mantenere lo spirito della mia domanda, perché PQ è rimasto il metodo di scelta e perché ha prosperato sopra la maggior parte degli altri metodi quando si trattava di prevenire gli attacchi di iniezione SQL?