0

我正在尝试创建一个构建有效 sqlite 查询的 python 脚本。我想避免 SQL 注入,所以我不能使用'%s'. 我已经找到了如何执行查询,cursor.execute('sql ?', (param))但是我想要如何获取解析的sql param. 如果我必须先执行查询才能获得最后执行的查询,这不是问题。

4

4 回答 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 回答