2013-12-09 11 views
9

Se un ingresso lamer viene inserito in una query SQL direttamente, l'applicazione diventa vulnerabile a SQL injection, come nel seguente esempio:Come posso prevenire l'SQL injection in PYTHON-DJANGO?

dinossauro = request.GET['username'] 

sql = "SELECT * FROM user_contacts WHERE username = '%s';" % username 

Per escludere le tabelle o nulla - rendendo la query:

INSERT INTO table (column) VALUES('`**`value'); DROP TABLE table;--`**`') 

Cosa si può fare per impedirlo?

+3

Posso chiederti perché stai scrivendo manualmente query SQL anziché utilizzare i modelli django? – smeso

+2

L'ORM django, al di fuori di 'raw' e' extra' eviterà le tue domande per te. Vedi i [documenti di sicurezza] (https://docs.djangoproject.com/en/dev/topics/security/#sql-injection-protection). – jonafato

risposta

3

Dal Django Docs:

SQL injection protezione

SQL injection è un tipo di attacco in cui un utente malintenzionato è in grado di eseguire codice SQL arbitrario su un database. Ciò può comportare l'eliminazione di record o la perdita di dati.

Utilizzando i queryset di Django, il codice SQL risultante sarà correttamente evaso dal driver del database sottostante. Tuttavia, Django offre anche agli sviluppatori la possibilità di scrivere query non elaborate o eseguire sql personalizzati. Queste funzionalità di devono essere utilizzate con parsimonia e si dovrebbe sempre fare attenzione a per evitare correttamente qualsiasi parametro che l'utente può controllare. Nell'aggiunta allo , dovresti prestare attenzione quando usi extra().

7

In primo luogo, probabilmente si dovrebbe usare solo Django ORM, impedirà qualsiasi possibilità di SQL injection.

Se per qualsiasi motivo non puoi o non vuoi, devi utilizzare Python Database API. Qui è il modo in cui fai di solito che in Django:

from django.db import connection 

cursor = connection.cursor() 
cursor.execute('insert into table (column) values (%s)', (dinosaur,)) 
cursor.close() 

È anche possibile utilizzare handy pacchetto python per ridurre il boilerplate:

from handy.db import do_sql 

do_sql('insert into table (column) values (%s)', (dinosaur,)) 
2

Se si utilizza .extra() la sintassi è:

YourModel.objects.extra(where=['title LIKE %s'], params=['%123%321%']) 

Ripetendo da this answer poiché questo è difficile da trovare e il docs che dice "you should always be careful to properly escape any parameters" non va avanti a s ay come per sfuggire loro correttamente!