我正在尝试使用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.
对于正确答案,我想:
有没有办法实现这个目标?我知道我可以使用""" %s """ %('table')
格式,但这会破坏这个问题的目的。
答案 0 :(得分:3)
你有两个问题:
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
但是,那不行。您不能使用参数化查询来使用select和from子句中的参数。您也不能在where子句中使用列名称的参数。
如果用户没有输入值(或者用户无论如何都无法更改),您(通常)不必担心SQL注入。