Per come la vedo io, gli attacchi di SQL injection possono essere prevenuti con:
- Filtraggio attento, filtro, input di codifica (prima dell'inserimento in SQL)
- Uso delle istruzioni preparate / query parametrizzate
Suppongo che ci siano pro e contro per ciascuno, ma perché il # 2 è decollato e considerato più o meno il modo di fatto di prevenire attacchi di iniezione? È solo più sicuro e meno incline all'errore o ci sono altri fattori?
Come ho capito, se il # 1 è usato correttamente e tutti gli avvertimenti sono presi in considerazione, può essere altrettanto efficace del # 2.
Sanitizing, Filtering e Encoding
C'è stata una certa confusione da parte mia tra ciò che significa sanitizing , filtering e encoding . Dirò che per i miei scopi, tutto quanto sopra può essere considerato per l'opzione 1. In questo caso capisco che la disinfezione e il filtraggio hanno il potenziale di modificare o scartare i dati di input, mentre la codifica conserva i dati così com'è , ma lo codifica correttamente per evitare attacchi di iniezione. Credo che l'escaping dei dati possa essere considerato un modo per codificarlo.
Query parametrizzate e libreria di codifica
Ci sono risposte in cui i concetti di parameterized queries
e encoding libraries
sono trattati in modo intercambiabile. Correggimi se sbaglio, ma ho l'impressione che siano diversi.
La mia comprensione è che encoding libraries
, non importa quanto siano bravi, hanno sempre il potenziale per modificare il "Programma" SQL, perché stanno facendo delle modifiche allo stesso SQL, prima che venga inviato al RDBMS.
Parameterized queries
d'altra parte, invia il programma SQL all'RDBMS, che quindi ottimizza la query, definisce il piano di esecuzione della query, seleziona gli indici che devono essere utilizzati, ecc., e quindi inserisce i dati, come l'ultimo passaggio all'interno dello stesso RDBMS.
Libreria di codifica
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
Query parametrizzata
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
Rilevanza storica
Alcune risposte menzionano che storicamente, le query parametriche (PQ) sono state create per motivi di prestazioni e prima che gli attacchi di iniezione che miravano a problemi di codifica diventavano popolari. Ad un certo punto è apparso evidente che i PQ erano anche piuttosto efficaci contro gli attacchi di iniezione. Per mantenere lo spirito della mia domanda, perché PQ è rimasto il metodo di scelta e perché è fiorito sopra la maggior parte degli altri metodi quando si tratta di prevenire attacchi di SQL injection?