【问题标题】:Properly escaping strings in raw Django SQL query在原始 Django SQL 查询中正确转义字符串
【发布时间】:2020-08-24 20:25:19
【问题描述】:

问题的根源在于糟糕的数据库设计可以追溯到我开始之前很久,但是这个问题不会在一天结束甚至一周结束之前得到解决。因此,我需要找到一种更好的方法来处理以下问题以添加功能。

我不得不偏离 Django ORM,因为我需要围绕 FROM <table> 编写逻辑,因此我需要构建一个原始 SQL 查询。我们选择了这条路线,而不是使用添加的新表每年更新几次models.py

here 开始有许多区域,其中 Django 文档说“不要在原始查询中使用字符串格式或在 SQL 字符串中引用占位符!”

如果我这样写查询:

cursor.execute("""
    SELECT * \
    FROM agg_data_%s \
    WHERE dataview = %s \
    ORDER BY sortorder """, [tbl, data_view])

它在tbl 周围添加单引号,这显然会导致问题,但会正确构造用单引号括起来的WHERE 子句。

这样做,不会在tbl 周围加上单引号,但会强制你在WHERE 周围加上单引号,这至少可以说是不好的(为SQL 注入打开它):

sql = """ \
    SELECT * \
    FROM agg_data_%s \
    WHERE dataview = '%s' \
    ORDER BY sortorder """ % (tbl, data_view)

cursor.execute(sql)

用这些柠檬做柠檬水?

【问题讨论】:

    标签: sql django orm


    【解决方案1】:

    参数%s 只能用于值。不适用于标识符的(部分),例如表/列名。如果您确定tbl安全,那么您可以使用以下命令进行转义:

    sql = """
        SELECT * \
        FROM agg_data_%s \
        WHERE dataview = %%s \
        ORDER BY sortorder """ % tbl, [data_view])

    这里%% 将“折叠”为%,因此您在第一次字符串插值后产生%s

    但最好不要为此使用不同的表,从而过滤表,例如通过外键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2013-09-27
      • 2015-11-21
      • 2012-03-16
      • 2020-01-21
      • 2015-11-05
      • 2022-08-18
      相关资源
      最近更新 更多