如何为LuaSQL引用值?

LuaSQL,似乎是 Lua 中大多数 SQL 数据库系统的规范库,似乎没有在查询中引用/转义值的功能。我正在编写一个使用 SQLite 作为后端的应用程序,我想用类似于 Python 的 DB-API 中指定的接口:

c.execute('select * from stocks where symbol=?', t)

但我甚至也可以接受更愚蠢的东西,比如:

conn:execute("select * from stocks where symbol=" + luasql.sqlite.quote(t))

是否有其他支持 SQLite 引用的 Lua 库?(LuaSQLite3 似乎没有。)或者是我错过了关于 LuaSQL 的某些东西? 我担心自己编写自己的解决方案(用正则表达式或其他方法),并出错。我应该只编写一个 sqlite3_snprintf 的包装器吗?

原文链接 https://stackoverflow.com/questions/1224806

点赞
stackoverflow用户15795
stackoverflow用户15795

我已经有一段时间没看 LuaSQL 了,但上次我检查它的时候不支持它。我使用了 Lua-Sqlite3。

require("sqlite3")

db = sqlite3.open_memory()

db:exec[[ CREATE TABLE tbl( first_name TEXT, last_name TEXT ); ]]

stmt = db:prepare[[ INSERT INTO tbl(first_name, last_name) VALUES(:first_name, :last_name) ]]

stmt:bind({first_name="hawkeye", last_name="pierce"}):exec()
stmt:bind({first_name="henry", last_name="blake"}):exec()

for r in db:rows("SELECT * FROM tbl") do
    print(r.first_name,r.last_name)
end
2009-08-04 00:16:10
stackoverflow用户33252
stackoverflow用户33252

LuaSQLite3 以及其他低层 SQLite 绑定程序都使用支持变量参数的预处理语句。这些使用方法将值绑定到语句参数上。由于 SQLite 不会解释绑定的值,因此绝对不存在 SQL 注入的可能性。这是迄今为止最安全(也是最高效)的方法。

uroc 展示了使用预处理语句绑定方法的示例。

2009-08-04 02:13:09
stackoverflow用户17774
stackoverflow用户17774

顺便提一句,在 Lua SQL 中,sqlite3 驱动程序中有一个未记录的转义函数,名为 conn:escape,其中 conn 是连接变量。

例如,通过以下代码:

print ("con:escape works. test'test = "..con:escape("test'test"))

得到的结果是:

con:escape works. test'test = test''test

我实际上尝试了一下,看看它会做什么。显然,他们的 postgres 驱动程序也有这样的函数。我是通过查看他们的测试找到这个函数的。

希望这能有所帮助。

2010-09-25 19:26:56