是否有可能阻止Django在原始SQL参数周围添加引号?

时间:2015-06-19 16:15:04

标签: django

如果参数是字符串,Django的原始SQL功能会在传递给SQL查询的任何参数周围添加单引号。

当我需要执行这样的查询时,这会让我失望:

SELECT * FROM table WHERE id IN (%s)

param是一个字符串,例如' 1,2,3',因此Django将查询呈现为:

SELECT * FROM table WHERE id IN ('1,2,3')

参数周围的引号会破坏查询。

在我看来,Django强迫我使用字符串插值(即在原始查询中使用字符串之前将其引入字符串),但文档明确指出我们不应该这样做。

来自文档:

  

使用params参数可以完全保护您免受SQL注入   攻击,攻击者注入任意SQL的常见漏洞   你的数据库。如果你使用字符串插值,迟早你会   成为SQL注入的受害者。只要你记得要经常使用   params论证你将受到保护。

有没有办法关闭报价?如果我们想要报价,我们可以添加它们,不是吗? (例如,姓名='%s')

1 个答案:

答案 0 :(得分:1)

Django原始查询将parameters作为单个列表或字典。所以在这种情况下,您应该像这样调用原始查询:

YourModel.objects.raw('SELECT * FROM table WHERE id in %s', [(1, 2, 3, 4, 5, ...)])