Mysql
 sql >> Database >  >> RDS >> Mysql

L'input esadecimale è sufficiente per disinfettare le query SQL?

Se sapessi perché si verifica un'iniezione SQL, potresti rispondere tu stesso a questa domanda.

Vediamo. Il CWE descrive le iniezioni SQL (CWE-89) come segue:

Inoltre:

Quindi, in pratica:gli input influenzati dall'esterno in una query SQL generata non vengono interpretati come previsto. La parte importante qui è:non interpretato come previsto .

Se l'input di un utente deve essere interpretato come una stringa MySQL letterale ma non lo è, è un'iniezione SQL. Ma perché succede?

Bene, stringa letterale hanno una certa sintassi con cui sono identificati dal parser SQL:

Inoltre:

Inoltre, per poter utilizzare le virgolette all'interno di stringhe letterali:

Poiché tutte queste ultime sequenze menzionate sono speciali per le stringhe letterali, è necessario che tutti i dati, che devono essere interpretati come stringhe letterali, siano adeguatamente elaborati per conformarsi a queste regole. Ciò significa in particolare:se uno qualsiasi dei caratteri citati deve essere utilizzato in una stringa letterale, deve essere scritto in uno dei modi citati.

Quindi, se la guardi da questo modo, non è nemmeno una questione di sicurezza ma semplicemente di trattare i dati in modo che vengano interpretati come previsto .

Lo stesso vale per gli altri valori letterali e altri aspetti di SQL.

Allora, che mi dici della tua domanda?

Sì, sarebbe al sicuro dalle iniezioni SQL. bin2hex restituisce una stringa che contiene solo caratteri esadecimali. E nessuno di questi caratteri richiede un trattamento speciale quando vengono utilizzati in una stringa letterale MySQL.

Ma seriamente, perché qualcuno dovrebbe voler usare queste ingombranti tecniche di formattazione quando ci sono librerie e framework che forniscono tecniche convenienti come istruzioni parametrizzate/preparate?