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.
对于正确答案,我会想:
- 保留问号格式以避免SQL注入攻击
- 保留三引号格式,以便我可以编写长SQL查询并且不会导致代码的可读性变差。
有没有办法做到这一点?我知道我可以使用""" %s """ %('table')
格式类型,但是这打破了这个问题的目的。
答
你有2个问题:
-
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注入。
好的,您的编辑与我的评论同时发生。你从哪里得到'myTable'和'date'字符串?这些可能不会来自设置中任何位置的自由文本?日期的_value_可以由用户输入,但他们是否会指定它将被写入到表格的“日期”列中?换句话说,你是否容易受到来自格式化表名和列名的SQL注入的攻击? – roganjosh