【问题标题】:How to fix syntax error with UPDATE in SQLite3 Python module如何在 SQLite3 Python 模块中使用 UPDATE 修复语法错误
【发布时间】:2021-04-22 15:27:29
【问题描述】:

我正在按照以下代码使用 python 模块 sqlite3:

# Enter the randomised data into the dictionary:
for square in cube:
    cur.execute("UPDATE cubes SET ? = ? WHERE id = ?", (square, cube[square], session["current_cube_id"]))
con.commit()

这会导致以下错误:

cur.execute("UPDATE cubes SET ? = ? WHERE id = ?", (square, cube[square], session["current_cube_id"]))
sqlite3.OperationalError: near "?": syntax error

我似乎对 INSERT 或 SELECT 查询没有问题,所以我假设 UPDATE 需要特定的语法。从文档、教程和其他示例中,我发现这似乎是正确的 - 任何人都可以帮助解决可能的语法错误吗?

【问题讨论】:

    标签: python sqlite sql-update


    【解决方案1】:

    您不能在UPDATE cubes SET ? = ? WHERE id = ? 中使用绑定变量(SET ? =)定义表、列名或 SQL 关键字

    我不知道为什么你觉得你需要一个动态的列名,而不是UPDATE cubes SET mycol = ? WHERE id = ?,但你需要以不同的方式指定你的列名。

    如果插入或删除中的目标列名或删除中的 where 条件列名使用 ? 占位符指定,则插入或删除会遇到完全相同的问题。我假设你没有这样做,所以你没有收到错误。

    如果您决定像下面那样动态构建查询字符串,请务必小心

    myquery = f"UPDATE cubes SET {my_user_supplied_column_name} = ? WHERE id = ?"
    
    cur.execute(myquery, (cube[square], session["current_cube_id"]))
    
    

    这会使您面临一大类极其严重的漏洞,SQL Injections,因为用户可以在my_user_supplied_column_name 中输入他们想要的任何内容。最好非常小心,因为它也有声誉风险:例如,如果一个精明的潜在雇主在您的代码中看到这种类型的结构,没有保护,可能会拒绝您的申请,因为这是一个极其严重、频繁和众所周知的风险。

    【讨论】:

    • 我需要遍历 54 列;如果我正确理解使用您的建议是否需要重复 54 ​​次?你能建议你如何遍历 54 列吗?仅供参考,到目前为止,我已经使用 CS50 模块进行学习,并且在使用 CS50 模块时可以使用,但是在尝试“移除拐杖”时,这现在不起作用。感谢您的帮助。
    • 感谢更新的答案,非常有帮助 - 注意到重新注入攻击。在遍历大量列时,是否有更好/更安全的方法来做到这一点?谢谢。
    • 您可以循环浏览您自己的硬编码列名列表,并将它们分入,如我在 SQL 注入示例中所示。只要您自己控制列名,在您的代码中,风险就相当小。在它旁边做一个评论,变量不是用户提供的。请注意,即使从文件中读取列名也是一种攻击媒介,如果该文件(显然是“只是数据”)受到损害。最后,必须循环遍历 54 个列名似乎是数据库设计的一种有问题的设计方法,但我不能说没有看到您的表结构是什么样的。
    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2023-03-30
    • 2019-09-01
    相关资源
    最近更新 更多