pyodbc执行SQL代码

问题描述:

我想使用pyodbc光标执行,以防止注入攻击的正确方法,因为这里建议: what does ? mean in python pyodbc modulepyodbc执行SQL代码

我的代码如下:

query = """\ 
SELECT 
    ?,count(*) 
FROM 
    ? 
WHERE 
    ?=? 
""", ('date', 'myTable', 'date', '2017-05-08') 
cursor.execute(query) 

我也得到一个错误:

TypeError: The first argument to execute must be a string or unicode query. 

对于正确答案,我会想:

  1. 保留问号格式以避免SQL注入攻击
  2. 保留三引号格式,以便我可以编写长SQL查询并且不会导致代码的可读性变差。

有没有办法做到这一点?我知道我可以使用""" %s """ %('table')格式类型,但是这打破了这个问题的目的。

+0

好的,您的编辑与我的评论同时发生。你从哪里得到'myTable'和'date'字符串?这些可能不会来自设置中任何位置的自由文本?日期的_value_可以由用户输入,但他们是否会指定它将被写入到表格的“日期”列中?换句话说,你是否容易受到来自格式化表名和列名的SQL注入的攻击? – roganjosh

你有2个问题:

  1. query是一个元组。执行参数化查询的方式是 如下:

    query = """SELECT ?,count(*) 
          FROM ? 
          WHERE ?=? """ 
    args = ('date', 'myTable', 'date', '2017-05-08') 
    cursor.execute(query, args) 
    

    你可以通过query*。这将扩大query到字符串和元组是什么execute预计:

    cursor.execute(*query) # 'query' here is defined as it is in your example 
    
  2. 但是,这是行不通的。您不能使用参数化查询来使用select和from子句中的参数。您也可以不在where子句中使用列名称的参数。

如果用户没有输入值(或者用户无法改变它),那么您(通常)不必担心SQL注入。