Mysql 针对多列查询的python注入保护
在下面的代码中,我将如何执行安全的sql注入?通常我会使用逗号而不是百分号,因为它不会直接插入字符串,但当我想从数据库中选择多个列时,我不能这样做 这可以工作,但不安全:Mysql 针对多列查询的python注入保护,mysql,python-2.7,sql-injection,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(quer
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))
调用此方法时,我需要能够更改我搜索的列数。无论如何,您不能使用execute的params参数向查询中添加列,因为这将在参数周围添加单引号,这将强制将其视为字符串。您将得到以下查询:
SELECT 'item1, item2, item3' FROM dash WHERE id=5 LIMIT 1
您必须自己对列进行插值
为了防止SQL注入,您有责任筛选列名列表,并根据此表的已知列列表对其进行验证。考虑这是一个白名单过程。是的,这是我迄今为止得到的结果。我理解您给出的答案,但是此方法在大多数调用时都需要从表中选择不同数量的列。有没有办法改变查询中调用的列数以及查询使用变量调用的列数?