多列查询的python注入保护

时间:2014-06-24 16:24:15

标签: mysql python-2.7 sql-injection

如何在以下代码中进行安全sql注入?通常我会使用逗号而不是百分号,因为它不会直接注入字符串,但是当我想从数据库中选择多个列时,我无法这样做。

这有效,但不安全:

def (columns)
    % columns is string of column names separated by commas
    id = 5
    queryStr = """SELECT %s FROM dash WHERE id=%s LIMIT 1"""
    q.execute(queryStr % (columns, id))

虽然这不起作用:

def (columns)
    % columns is string of column names separated by commas
    id = 5
    queryStr = """SELECT %s FROM dash WHERE id=%s LIMIT 1"""
    q.execute(queryStr, (columns, id))

当我调用此方法时,我需要能够更改我搜索的列数。

1 个答案:

答案 0 :(得分:0)

你不能使用params的{​​{1}}参数来为查询添加列,因为这将在参数周围添加单引号,这将强制它被视为字符串。你最终会得到这个查询:

execute()

您必须自己插入列。

为了防止SQL注入,您有责任过滤列名列表并根据此表的已知列列表进行验证。请将此视为白名单进程。