【发布时间】:2015-09-05 16:59:21
【问题描述】:
如果参数是字符串,Django 的原始 SQL 功能会在您传递给 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 名称 = '%s')
【问题讨论】:
标签: django