【问题标题】:How do I prevent sqlite from evaluating a string as a math expression?如何防止 sqlite 将字符串评估为数学表达式?
【发布时间】:2012-09-04 20:56:07
【问题描述】:

简单的问题可能有一个非常简单的答案。我正在将格式为“2012-06-10”的日期字符串从 Python 脚本写入 TEXT 列。

例如

cur.execute("CREATE TABLE tbl(date TEXT, ...)") cur.execute('INSERT INTO tbl VALUES(%s)' % (str(date[i])), ...)

脚本实际上是评估日期字符串,因此“2012-06-10”作为“1996”写入表中。通过阅读文档,我猜这与类型亲和性有关,但我不知道如何覆盖,甚至不知道为什么要评估字符串。

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    两种方式:

    • 通过使用参数化查询:cur.execute("INSERT INTO tbl VALUES (?), [str(date[i])])。这是最好的方法。这样做。第二种方法仅供后人参考。
    • 通过引用值(注意:几乎可以肯定,在几乎所有情况下,这都是错误的方式):cur.execute("INSERT INTO tbl VALUES ('%s')" %(str(date[i]), )。这种方法不是最理想的,因为除非你小心,否则你很容易受到 SQL 注入的攻击。

    要了解为什么会这样,想象一下您的代码发送到 SQLite 的查询:

     INSERT INTO tbl VALUES (2012-06-10);
    

    SQL 引擎正确评估的结果:

     INSERT INTO tbl VALUES (1996);
    

    引用值将解决此问题:

     INSERT INTO tbl VALUES ('2012-06-10');
    

    但如果值中包含某些字符(' 等字符或空字节),则可能会导致问题。

    但是,对于参数化查询,值是与查询分开发送的,因此它们不会被误解。

    【讨论】:

    • 为什么第一种方式更好?因为SQL injection.
    • 如果值已经是字符串(或datetime.date 对象,Python sqlite3 模块会自动转换为字符串),那么str 调用是多余的。
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多