【问题标题】:Are these SQL input parameters vulnerable to injection?这些 SQL 输入参数是否容易被注入?
【发布时间】:2015-06-22 15:55:02
【问题描述】:

我在 Django 1.8 中使用 Postgres 9.4 后端工作。我目前正在使用django.db.connection 运行以下查询:

cursor = connection.cursor()
codes = ['01', '02'] # these are actually obtained as GET parameters

query = "SELECT number_str, bnf_id, name FROM mytable WHERE "
for i, code in enumerate(codes):
    q = "(number_str ILIKE '{}%' OR name ~* '{}') "
    query += q.format(code, code)
    if i < len(codes)-1:
        query += 'OR '
cursor.execute(query)

这可行,但它是否容易受到 SQL 注入的影响?

如果是这样,有什么方法可以在将codes 传递到查询字符串之前转义它们,这仍然适用于这个正则表达式查询吗?

【问题讨论】:

    标签: python regex django postgresql


    【解决方案1】:

    我原以为这个容易受到 SQL 注入的影响,因为您从用户那里获取了您的内容 codes,并且在将其放入查询之前不要检查或清理它。

    确保您的 SQL 命令被转义的更好方法是使用execute,如下所示:

    query = "SELECT number_str, bnf_id, name FROM mytable WHERE "
    for i, code in enumerate(codes):
        q = "(number_str ILIKE %s OR name ~* %s) "
        query += q
        if i < len(codes)-1:
            query += 'OR '
    
    # create an interleaved list of '<code>%', '<code>' pairs:
    qcodes1 = [s + '%' for s in codes]
    qcodes2 = codes
    qcodes = [code for p in zip(qcodes1, qcodes2) for code in p]
    
    cursor.execute(query, qcodes)
    

    (注意execute 中的逗号而不是%)。

    顺便问一下,对于这种类型的查询,Django 的查询集有什么问题?

    【讨论】:

    • 谢谢。这是startswith 查询而不是is equal to 查询,所以我无法检查代码是否有效。我也不能保证它们是整数,它们可能是字母字符串。 (这是用于用户可以通过代码或名称查询的自动完成字段。)但我想我可以查找冒号和括号等等?
    • 我不能使用 Django 查询集,因为我需要查询具有唯一名称列表的物化视图。
    【解决方案2】:

    您可以使用 MySQLDb 库中的 escape_string() 来引用字符串:

    http://mysql-python.sourceforge.net/MySQLdb.html#id5

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 2020-03-02
      • 2011-05-15
      相关资源
      最近更新 更多