pyodbc执行SQL代码

时间:2017-05-08 19:11:03

标签: python pyodbc

我正在尝试使用pyodbc游标执行正确的方法来防止注入攻击,如下所示: what does ? mean in python pyodbc module

我的代码如下:

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查询,而不是松散的代码可读性。
  3. 有没有办法实现这个目标?我知道我可以使用""" %s """ %('table')格式,但这会破坏这个问题的目的。

1 个答案:

答案 0 :(得分:3)

你有两个问题:

  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子句中使用列名称的参数。

  3. 如果用户没有输入值(或者用户无论如何都无法更改),您(通常)不必担心SQL注入。