如何防止PYTHON-DJANGO中的SQL注入?
如果将lamer输入直接插入到SQL查询中,应用程序将容易受到SQL注入的攻击,如以下示例所示:如何防止PYTHON-DJANGO中的SQL注入?,python,sql,django,security,sql-injection,Python,Sql,Django,Security,Sql Injection,如果将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;--`**`')
dinossauro = request.GET['username']
sql = "SELECT * FROM user_contacts WHERE username = '%s';" % username
要删除表或任何内容--进行查询:
INSERT INTO table (column) VALUES('`**`value'); DROP TABLE table;--`**`')
如何防止这种情况发生?从以下方面:
SQL注入保护
SQL注入是一种攻击类型,其中
恶意用户能够在数据库上执行任意SQL代码。
这可能会导致记录被删除或数据泄漏
通过使用Django的QuerySet,生成的SQL将正确地
由基础数据库驱动程序转义。然而,Django也给出了
开发人员可以编写原始查询或执行自定义sql。这些
应谨慎使用功能,并且应始终小心
正确转义用户可以控制的任何参数。在里面
此外,在使用extra()时应谨慎
首先,您可能应该使用,它将防止任何SQL注入的可能性 如果出于任何原因,你不能或不想这样做,那么你应该使用。以下是您在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,))
如果使用的是
.extra()
,则语法为:
YourModel.objects.extra(where=['title LIKE %s'], params=['%123%321%'])
从这里重复,因为这很难找到,而且上面说的是
“您应该始终小心地正确转义任何参数”
不要继续说如何正确转义它们 我可以问您为什么要手动编写sql查询而不是使用django模型吗?raw
和extra
之外的django ORM将为您逃避查询。看。