Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 针对多列查询的python注入保护_Mysql_Python 2.7_Sql Injection - Fatal编程技术网

Mysql 针对多列查询的python注入保护

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

在下面的代码中,我将如何执行安全的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))
调用此方法时,我需要能够更改我搜索的列数。

无论如何,您不能使用execute的params参数向查询中添加列,因为这将在参数周围添加单引号,这将强制将其视为字符串。您将得到以下查询:

SELECT 'item1, item2, item3' FROM dash WHERE id=5 LIMIT 1
您必须自己对列进行插值


为了防止SQL注入,您有责任筛选列名列表,并根据此表的已知列列表对其进行验证。考虑这是一个白名单过程。

是的,这是我迄今为止得到的结果。我理解您给出的答案,但是此方法在大多数调用时都需要从表中选择不同数量的列。有没有办法改变查询中调用的列数以及查询使用变量调用的列数?