如果参数是字符串,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')
答案 0 :(得分:1)
Django原始查询将parameters作为单个列表或字典。所以在这种情况下,您应该像这样调用原始查询:
YourModel.objects.raw('SELECT * FROM table WHERE id in %s', [(1, 2, 3, 4, 5, ...)])