SQL raw
Quando scrivi SQL - per tutto ciò che richiede veramente input umani, sono state fatte molte cose per evitare l'iniezione.
Tutti quelli che hanno sentito parlare di SQL injection sanno che (sto per usare PHP come esempio) fare qualcosa del genere non è sicuro:
$sql = "SELECT * FROM 'users'
. WHERE 'userName' = "{$_POST["username"]}"
. AND 'pass' = "{$_POST["pass"]}";";
Magic
Poi, naturalmente, a qualcuno è venuto in mente l'idea di usare "virgolette magiche" per gestire l'input del programma che non è stato disinfettato correttamente e messo direttamente in sql come risultato di cattive pratiche. Questo non ha realmente risolto il problema con SQL injection, ma ha significato che tutti gli input dell'utente sono stati storpiati.
Aggiunta di barre
Quindi, alcune persone hanno disattivato le virgolette magiche. Quindi, hanno analizzato l'input dell'utente prima del punto di SQL attraverso addslashes()
che in teoria sfugge a tutte le virgolette e il tuo hacker non può fare ' OR 1=1
, ma anche la documentazione di addslashes è che non devi usare addslashes, dice che usa la funzione specifica del database come mysql_real_escape_string()
, ma si dice che questo non sia abbastanza per alcuni.
Aggiunta di barre specifiche al database
Quindi, non possiamo usare% specifico di DBMS *_real_escape_string
, non possiamo usare add slashes
, la cosa "virgolette" ha causato un sacco di problemi, e il web è pieno di citazioni di parole brevi come:
"A dedicated hacker will find a way to jump through your quote-escaping loops, just use the DBAL prepared statements" - John Q any programmer
Okay, quindi mi hai spaventato abbastanza da usare le istruzioni preparate e un DBAL. Non ha davvero spiegato nulla, ma suona bene perché l'ho sentito molto.
Dichiarazioni preparate
Quindi ora stiamo usando PDO, o un DBAL da un framework, o qualcos'altro che avvolge tutto il nostro sql e si assicura che qualcuno non possa eseguire un'iniezione sql.
La mia domanda è fondamentalmente un "perché no?", non un "cosa dovrei usare?". Il web è pieno di persone che ti dicono di usarlo o di usarlo o qualunque , ma nessuna spiegazione del perché queste cose devono accadere.
Domande dirette
Domande puntate (promemoria, sto chiedendo di SQL, PHP era un linguaggio di esempio a causa della sua cattiva reputazione su SQL, i concetti sono universali):
- Perché non possiamo sfuggire a tutti gli input dell'utente usando "magic"?
- Perché non sono stati aggiunti "abbastanza buoni"?
- Cosa c'è di sbagliato nell'usare funzioni di escape specifiche del DB, e perché è stato meglio di addslashes?
- Perché le dichiarazioni preparate con framework e PDO vengono considerate il gold standard di SQL? Perché stanno meglio? Perché non posso fare un'iniezione SQL con questi, dove potrei avere con i mezzi precedentemente citati? Può un programmatore che in qualche modo riesca ancora a rovinare tutto? Cosa dovrebbero cercare?
- Altri dubbi che non ho sollevato?