2015-06-19 61 views
0

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

这打破了我,当我需要做这样的查询:

SELECT * FROM table WHERE id IN (%s)

的参数是一个字符串,如“1,2,3”,所以Django的渲染查询为:

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

周围帕拉姆这些报价中断查询。

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

从文档:

使用把params参数完全保护您免受SQL注入攻击 ,共同开发,其中攻击者注入任意SQL进入 数据库。如果你使用字符串插值,迟早你会成为SQL注入的牺牲品。只要你记得总是使用 params参数,你就会受到保护。

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

回答

1

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

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

+0

我明白了。它接受一个整数列表。我想我必须将整数列表格式化为一个字符串,这就是我如何得到引号。 – John

相关问题