Rimuoviamo completamente PHP dall'equazione per un momento.
L'iniezione SQL consente a un utente malintenzionato di manipolare la query SQL per essere ciò che desidera che la query venga eseguita. Questo può essere il dumping del contenuto del database, la modifica dei dati e persino l'esecuzione del codice.
L'esempio che hai fornito è effettivamente vulnerabile all'iniezione SQL. Ai fini della dimostrazione, permettimi di semplificarlo un po ':
mysqli_query($conn, "SELECT trans FROM dictionary WHERE word = '$search'");
Dato un valore di security
, la query risultante apparirebbe così:
SELECT trans FROM dictionary WHERE word = 'security';
Questo è innocente e normale. Tuttavia, dato quanto segue, un utente malintenzionato può ottenere la versione di MySQL in esecuzione:
' @@version -- -
Questo causerebbe alla query il risultato di quanto segue:
SELECT trans FROM dictionary WHERE word = '' @@version -- - ';
In definitiva, a seconda delle autorizzazioni e della configurazione, un utente malintenzionato può passare da un database all'altro nel server del database, leggere i file dal filesystem o eseguire il codice. Ecco un esempio di come un utente malintenzionato può leggere file da un sistema operativo basato su Linux:
' LOAD_FILE('/etc/passwd') -- -'
Ciò quindi comporterà la seguente query:
SELECT trans FROM dictionary WHERE word = '' LOAD_FILE('/etc/passwd') -- -'
Ci sono un paio di cose da tenere a mente a questo punto:
- Non tutte le vulnerabilità di SQL injection sono uguali a
- Le tecniche per leggere i file, eseguire codice e eseguire il dump dei database varieranno ampiamente dalla lingua, dal server database di back-end e dalle circostanze che circondano la vulnerabilità stessa
Indipendentemente da ciò, raccomanderei vivamente che una vulnerabilità di SQL injection venga corretta mediante la parametrizzazione o la whitelist di input dell'utente in base alle esigenze della funzionalità in questione.
Ho iniziato con la rimozione di PHP dalla discussione perché l'iniezione SQL non è dipendente dalla lingua e dal framework: influisce su qualsiasi linguaggio che consenta la connettività del database. Indipendentemente dalla lingua, l'input dell'utente deve essere trattato con sospetto e gestito in modo appropriato.