gpt4 book ai didi

python - pyodbc执行SQL代码

转载 作者:行者123 更新时间:2023-11-30 22:37:33 26 4
gpt4 key购买 nike

我正在尝试使用 pyodbc 游标执行正确的方法来防止注入(inject)攻击,如下所示: 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 注入(inject)攻击
  2. 保留三引号格式,这样我就可以编写长 SQL 查询,并且不会影响代码的可读性。

有办法实现这一点吗?我知道我可以使用 """%s """%('table') 格式类型,但这违背了这个问题的目的。

最佳答案

您有 2 个问题:

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

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

    您可以使用 * 传递查询。这会将 query 扩展为一个字符串和一个元组,这正是 execute 所期望的:

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

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

关于python - pyodbc执行SQL代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43855514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com