Sto insegnando la sicurezza IT nei politecnici. Spesso per gli studenti hanno una certa confusione sui termini usati per l'iniezione SQL, quindi permettimi di provare a chiarire.
Nel contesto di un'applicazione web come Facebook,
L'iniezione SQL avviene quando il normale utente Web inserisce il codice SQL nei campi dati
Ad esempio,
' OR '1'='1 into the textboxes of a login form.
La persona migliore per prevenire l'SQL injection è lo sviluppatore web, ovvero la persona incaricata di scrivere il codice per l'applicazione Web per leggere / scrivere i dati nel database.
Il modo più semplice per prevenire l'SQL injection dallo sviluppatore web è utilizzare query parametrizzate.
Le istruzioni preparate e le query con parametri indicano la stessa cosa.
Userò query parametrizzate da questo punto in poi.
Le query parametrizzate si riferiscono al modo in cui vengono definiti per la prima volta il codice SQL e quindi i dati vengono inseriti all'interno dei parametri appropriati.
Ad esempio in .Net
Update 'users' set 'name' = @name where 'id' = @id
i parametri @name e @id sono i dati. Il resto è il codice SQL.
Ricorda che le query con parametri sono di solito, ma non sempre fatte nel codice dell'applicazione web.
Ci sono 2 modi comuni per scrivere query parametrizzate.
- Nel codice dell'applicazione Web in base alla lingua utilizzata
- Nel database utilizzando stored procedure
Quindi in un certo senso, sì, le stored procedure sono una forma di query parametrizzate.
Esistono altri modi per prevenire l'iniezione SQL, evitando caratteri speciali come le virgolette singole. Ad esempio, in PHP, puoi usare mysql_real_escape_string che in pratica mette solo le barre prima delle virgolette singole.
Questo non è l'ideale a causa di problemi con% e underscore per operatore LIKE in determinati database come MySQL. vedi questo pdf per maggiori dettagli.
Per farla breve, tutte le opzioni suggerite hanno a che fare con la disinfezione (pulizia) dell'input dell'utente per eliminare il codice SQL.
Il modo migliore è utilizzare query parametrizzate a seconda del linguaggio di programmazione utilizzato.
Fine della storia.