如何防止sqlite将字符串作为数学表达式进行求值?

acp*_*eon 1 python sqlite

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

例如

cur.execute("CREATE TABLE tbl(date TEXT, ...)")

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

该脚本实际上是在评估日期字符串,因此"2012-06-10"会以"1996"的形式写入表中.从阅读文档,我猜这与类型亲和力有关,但我无法想象如何覆盖甚至为什么要对字符串进行求值.

Dav*_*ver 9

两种方式:

  • 通过使用参数化查询: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);
Run Code Online (Sandbox Code Playgroud)

哪个SQL引擎正确评估为:

 INSERT INTO tbl VALUES (1996);
Run Code Online (Sandbox Code Playgroud)

引用该值将解决此问题:

 INSERT INTO tbl VALUES ('2012-06-10');
Run Code Online (Sandbox Code Playgroud)

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

但是,使用参数化查询时,值将与查询分开发送,因此不会被误解.

  • 为什么第一种方式更好?因为[SQL注入](http://en.wikipedia.org/wiki/SQL_injection). (3认同)