如何防止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"
的文档不会继续说出如何正确地逃脱它们!