如何在PYTHON-DJANGO中防止SQL注入



如果将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"的文档并没有继续说如何正确地逃离它们!

相关内容

  • 没有找到相关文章

最新更新