【问题标题】:Is it possible to stop Django adding quotes around raw SQL params?是否可以停止 Django 在原始 SQL 参数周围添加引号?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 啊,我明白了。它接受整数列表。我在想我必须将整数列表格式化为字符串,这就是我获取引号的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2012-12-28
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多