如何防止 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? rawextra 之外的 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 注入?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止Android中的SQL注入?

如何防止 JSP 中的 SQL 注入?

如何防止sql存储过程中的重复更新

使用“database/sql”时如何防止 Go 中的 SQL 注入攻击?

如何防止nodejs中的sql注入和续集? [关闭]

如何防止此类中的 sql 注入? [关闭]