我正在尝试创建一个构建有效 sqlite 查询的 python 脚本。我想避免 SQL 注入,所以我不能使用'%s'
. 我已经找到了如何执行查询,cursor.execute('sql ?', (param))
但是我想要如何获取解析的sql param
. 如果我必须先执行查询才能获得最后执行的查询,这不是问题。
问问题
1099 次
4 回答
1
如果您不只是在进行参数替换,而是在完整构建 SQL,那么您必须在最后使用字符串操作来做到这一点。替换总是只代表?
一个值。在内部,SQL 字符串被编译为 SQLite 自己的字节码(你可以用 找到它生成的内容EXPLAIN thesql
),并且?
只需将值存储在值堆栈中的正确位置即可完成替换;在结构上改变查询需要不同的字节码,所以仅仅替换一个值是不够的。
是的,这确实意味着您必须非常小心。如果您不想允许更新,请尝试以只读模式打开数据库连接。
于 2012-06-27T10:32:16.510 回答
1
如果您试图将数据库的更改传输到另一台计算机,为什么必须将它们表示为 SQL 字符串?为什么不将查询字符串和参数腌制为一个元组,让另一台机器也使用 SQLite 参数化来查询其数据库?
于 2012-06-27T10:46:16.797 回答
0
我想如何获取解析的“sql 参数”。
它都是开源的,因此您可以完全访问进行解析/清理的代码。为什么不只是阅读这段代码并了解它是如何工作的,以及是否有一些(可能未记录的)实现可以重用?
于 2012-06-27T10:20:08.000 回答
0
使用 DB-API 的参数替换。将?
作为占位符放在要使用值的任何位置,然后提供一个值元组作为游标execute()
方法的第二个参数。
# Never do this -- insecure!
symbol = 'hello'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
# Do this instead
t = (symbol,)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print c.fetchone()
更多参考在手册中。
于 2012-06-27T09:30:32.243 回答