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

Come funziona l'iniezione di SQL e come posso proteggermi da essa

Un'iniezione SQL è una query SQL formata in modo dannoso utilizzata per "confondere" un database SQL nel fornire qualcosa che non dovrebbe. Ad esempio, considera la seguente query

"SELECT * FROM `users` WHERE `username` = '$name'";

In un caso normale, questo funzionerà. Se inviamo "Jack" a questo, restituirà tutti gli utenti chiamati Jack. Tuttavia, se un utente immette, dì "' OR 1=1", la query risultante sarebbe

"SELECT * FROM `users` WHERE `username` = '' OR 1=1";

Poiché 1 è sempre uguale a 1 e la clausola di combinazione è OR, restituirà true su ogni riga, che a sua volta mostrerà OGNI riga all'utente malintenzionato. Usando questa tecnica, qualcuno può visualizzare l'intero database. Considera anche se qualcuno invia qualcosa come "'; DROP TABLE users ";--, che risulta in

"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";

Che sono due query, una che non farà nulla, la seconda che cancellerà l'INTERO database degli utenti, con conseguente perdita dei tuoi dati.

Il metodo migliore per prevenire le iniezioni SQL consiste nell'utilizzare istruzioni preparate. Con questi, invii una query al database SQL che dice qualcosa del tipo

"SELECT * FROM `users` WHERE `username` = '?'";

Ciò consente al database di conoscere il formato della query (WHERE nome utente è uguale a un valore), quindi non c'è confusione quando viene fornita una query di testo normale. Quindi il database sa aspettarsi un valore e dove inserirlo. Quindi si passa quel valore al database che può utilizzare per la ricerca. Questo è anche meglio in quanto il database può ottimizzare la query per una ricerca più rapida.

Leggi le dichiarazioni preparate, che spiegheranno questo in modo più dettagliato.