[Python] SQL injection [era: Esclusione della query vuota]

Daniele Varrazzo piro a develer.com
Gio 11 Set 2014 12:39:03 CEST


On 2014-09-11 10:19, Riccardo Brazzale wrote:
> Scusate, conosco python ma non in maniera cosi' approfondita.
>
> Ma :
>
> import MySQLdb as my
>
> stringa = "Daniele'; DROP TABLE rubrica; --"
> stringa = my.escape_string(stringa)
>
> sql = "... %s ..."
> c.execute(sql, (stringa))
>
>
> ... non risolve il problema?

No, non lo risolve: lo crea.

Se la strategia di passaggio dei parametri alle query e' quella di 
escapare a mano ogni singolo argomento di ogni singola query, stai 
sicuro che qualcuno te lo dimenticherai. Stai sicuro che in una funzione 
un po' strana del tuo programma i parametri dovranno passare prima in 
un'altra funzione e non sara' piu' chiaro chi deve applicare l'escape - 
alcuni saranno doppi, altri mancanti. Stai sicuro che qualcuno lo 
considererai sicuro perche' e' un intero quindi non serve l'escape - ma 
poi quell'intero, che era il numero di pagina del tuo blog, qualcuno si 
accorge che se lo cambia in "a" nella url la pagina si rompe... e li' 
comincia il divertimento. Di' ciao al russo. Non Victor, l'altro :)

Infatti, e qui so di infrangere il cuore di molti, la striscia "little 
bobby tables" e' fondamentalmente sbagliata. La conseguenza della mamma 
hacker ("I hope you have learned to sanitize your database inputs") e' 
l'approccio sbagliato al problema. L'approccio giusto e' quello di *non* 
porsi il problema dell'escape nel proprio applicativo e delegarlo a 
qualcuno ad un livello sottostante (che puo' essere il driver del 
database o il server stesso). Questo e' un caso dove la pigrizia vince 
(a patto che uno si scelga i collaboratori giusti).


-- Daniele


Maggiori informazioni sulla lista Python