如何防止 PYTHON-DJANGO 中的 SQL 注入?
Posted
技术标签:
【中文标题】如何防止 PYTHON-DJANGO 中的 SQL 注入?【英文标题】:How can I prevent SQL injection in PYTHON-DJANGO? 【发布时间】:2013-12-26 09:58:57 【问题描述】:如果将 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;--`**`')
可以做些什么来防止这种情况发生?
【问题讨论】:
请问您为什么要手动编写sql查询而不是使用django Models?raw
和 extra
之外的 django ORM 将为您避免查询。请参阅security docs。
【参考方案1】:
来自Django Docs:
SQL 注入保护
SQL 注入是一种攻击类型,其中 恶意用户能够在数据库上执行任意 SQL 代码。 这可能会导致记录被删除或数据泄露。
通过使用 Django 的查询集,生成的 SQL 将正确 由底层数据库驱动程序转义。然而,Django 也给出了 开发人员可以编写原始查询或执行自定义 sql。这些 应谨慎使用功能,并且应始终小心 正确转义用户可以控制的任何参数。在 另外,使用 extra() 时要小心。
【讨论】:
【参考方案2】:首先,您可能应该只使用Django ORM,它可以防止任何 SQL 注入的可能性。
如果出于某种原因您不能或不想这样做,那么您应该使用Python Database API。这是您在 Django 中通常执行此操作的方式:
from django.db import connection
cursor = connection.cursor()
cursor.execute('insert into table (column) values (%s)', (dinosaur,))
cursor.close()
您也可以使用handy python 包来减少样板:
from handy.db import do_sql
do_sql('insert into table (column) values (%s)', (dinosaur,))
【讨论】:
【参考方案3】:如果你使用.extra()
,语法是:
YourModel.objects.extra(where=['title LIKE %s'], params=['%123%321%'])
从this answer 重复这里,因为这很难找到,而说"you should always be careful to properly escape any parameters"
的docs 不要继续说如何 正确地逃避它们!
【讨论】:
以上是关于如何防止 PYTHON-DJANGO 中的 SQL 注入?的主要内容,如果未能解决你的问题,请参考以下文章