Insegno sicurezza IT in politecnici. Spesso gli studenti hanno una certa confusione sui termini usati per SQL injection, quindi lasciatemi provare a chiarire.
Nel contesto di un'applicazione web come Facebook,
SQL injection è quando il il normale utente web inserisce il codice SQL nei campi dati Es.
'OR' 1 '=' 1 nelle caselle di testo di un modulo di accesso.
per prevenire l'iniezione di SQL è lo sviluppatore web, ovvero la persona incaricata di scrivere il codice per l'applicazione web per leggere / scrivere dati nel database.
Il modo più semplice per prevenire l'iniezione di SQL da parte dello sviluppatore web è usare query con parametri.
Le istruzioni preparate e le query con parametri significano la stessa cosa.
Userò le query con parametri da questo punto in poi.
Le query parametrizzate si riferiscono al modo in cui il codice SQL viene prima definito e quindi i dati vengono inseriti nei parametri appropriati.
Ad esempio in .Net
Aggiorna `users` set` name` = @name dove `id` = @id
i parametri @name e @id sono i dati. Il resto è il codice SQL.
Tieni presente che le query parametrizzate vengono solitamente ma non sempre eseguite nel codice dell'applicazione web.
Ci sono 2 comuni modi per scrivere query parametrizzate.
- Nel codice dell'applicazione web a seconda della lingua utilizzata
- Nel database utilizzando procedure memorizzate
Quindi, in un certo senso, sì , le stored procedure sono una forma di query parametrizzate.
Esistono altri modi per prevenire l'iniezione SQL, ovvero l'escape di caratteri speciali come le virgolette singole. Ad esempio, in PHP, puoi usare mysql_real_escape_string che fondamentalmente mette solo le barre prima delle virgolette singole.
Questo non è l'ideale a causa di problemi con% e underscore per l'operatore LIKE in alcuni 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 ripulire il codice SQL.
Il modo migliore è utilizzare query parametrizzate a seconda del linguaggio di programmazione utilizzato.
Fine della storia.