如何防止PYTHON中的SQL注入

如果直接将拉姆输入插入到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"的文档不会继续说出如何正确地逃脱它们!

链接地址: http://www.djcxy.com/p/16797.html

上一篇: How can I prevent SQL injection in PYTHON

下一篇: Storing hierarchical data in a database