如果将lamer输入直接插入到SQL查询中,则应用程序容易受到SQL注入的攻击,如以下示例所示:
dinossauro = request.GET['username']
sql = "SELECT * FROM user_contacts WHERE username = '%s';" % username
删除表或任何东西——进行查询:
INSERT INTO table (column) VALUES('`**`value'); DROP TABLE table;--`**`')
如何防止这种情况发生?
首先,您可能只应该使用Django ORM,它可以防止SQL注入的任何可能性。
如果由于任何原因您不能或不想,那么您应该使用Python数据库API。以下是在Django中通常使用的方法:
from django.db import connection
cursor = connection.cursor()
cursor.execute('insert into table (column) values (%s)', (dinosaur,))
cursor.close()
你也可以使用方便的python包来减少样板:
from handy.db import do_sql
do_sql('insert into table (column) values (%s)', (dinosaur,))
来自Django文档:
SQL注入保护
SQL注入是一种攻击类型恶意用户能够在数据库上执行任意SQL代码。这可能导致记录被删除或数据泄露。
通过使用Django的查询集,得到的SQL将正确被底层数据库驱动程序转义。然而,Django也给出了开发人员能够编写原始查询或执行自定义sql。这些应谨慎使用功能,并且应始终小心以正确地转义用户可以控制的任何参数。在里面此外,使用extra()时应谨慎。
如果使用.extra()
,语法为:
YourModel.objects.extra(where=['title LIKE %s'], params=['%123%321%'])
重复这个答案,因为这很难找到,说"you should always be careful to properly escape any parameters"
的文档并没有继续说如何正确地逃离它们!