如果将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;--`**`')
可以采取哪些措施来防止这种情况发生?
答案 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()时应谨慎。