如何在PYTHON-DJANGO中阻止SQL注入?

时间:2013-12-09 10:22:04

标签: python sql django security sql-injection

如果将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;--`**`')

可以采取哪些措施来防止这种情况发生?

3 个答案:

答案 0 :(得分:8)

首先,您可能只需使用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,))

答案 1 :(得分:3)

如果您使用的是.extra(),则语法为:

YourModel.objects.extra(where=['title LIKE %s'], params=['%123%321%'])

this answer重复此处很难找到,而"you should always be careful to properly escape any parameters" <?php $post_id = 15; $thumbnail = wp_get_attachment_url( get_post_thumbnail_id($post->ID) ); ?> 说明{em> 如何正确地逃避它们!

答案 2 :(得分:2)

来自Django Docs

  

SQL注入保护

     

SQL注入是一种攻击类型   恶意用户能够在数据库上执行任意SQL代码。   这可能导致记录被删除或数据泄漏。

     

通过使用Django的查询集,生成的SQL将是正确的   由底层数据库驱动程序转义。但是,Django也给出了   开发人员有权编写原始查询或执行自定义sql。这些   应该谨慎使用这些功能,你应该小心谨慎   正确地转义用户可以控制的任何参数。在   此外,使用extra()时应谨慎。