【问题标题】:Dynamically creating a placeholder to insert many column values for a row in SQLite table动态创建占位符以在 SQLite 表中为一行插入许多列值
【发布时间】:2014-06-15 22:40:27
【问题描述】:

我知道可以在 SQLite 数据库中使用具有值元组 ('2006-03-28', 'BUY', 'IBM', 1000, 45.00) 和相应占位符 (?, ?, ?, ?, ?) 的变量在查询字符串中插入许多列值。我在我的程序中动态创建值元组,它们最多可以容纳约 300 个值。我想知道是否有一种安全的(关于 SQL 注入攻击)方法来为查询字符串动态生成相应的占位符元组字符串(?, ?, ?, ...)?我要求这样做是为了避免繁琐地计算、添加和删除?s,因为我的数据库结构和值元组在整个开发过程中都会发生变化。感谢您的想法。

【问题讨论】:

    标签: python sql sqlite dynamic tuples


    【解决方案1】:

    根据您的values 中的项目数构建一个字符串,例如:

    def place_holder(values):
        return '({})'.format(', '.join('?' * len(values)))
    
    values = ['a', 'b', 'c']
    ph = place_holder(values)
    # (?, ?, ?)
    

    然后是这样的:

    your_cursor.execute('insert into your_table values {}'.format(ph), values)
    

    如果它不符合您的架构,您就会遇到问题,但这是另一个问题...

    【讨论】:

    • 我在这里也注意到了这个答案 [stackoverflow.com/q/7991183/2441384] - 我有这样的功能。我想知道在将其传递给execute() 之前将其连接到查询字符串是否对 SQL 注入攻击具有鲁棒性?另一个答案似乎暗示了这一点。我想知道为什么要打扰占位符?
    • @gromiczek 因为您负责创建占位符字符串,所以您知道它是安全的...不安全位来自values 本身,该部分仍将被转义/妥善处理。大多数人失败的地方是试图将values 放入查询字符串中...创建自己的占位符字符串以容纳查询字符串所需的必要内容(表名/占位符/等)很好.
    • @JonClements 我在下面的帖子中尝试了你的想法,但它不起作用。请您看一下stackoverflow.com/questions/59727201/…,看看为什么我在运行脚本后没有错误但无法插入列表信息?
    猜你喜欢
    • 1970-01-01
    • 2016-10-03
    • 2020-03-24
    • 2014-09-29
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多