如何引用LuaSQL的值?

时间:2009-08-03 21:51:02

标签: sql sqlite lua sql-injection escaping

LuaSQL,似乎是Lua中大多数SQL数据库系统的规范库,似乎没有任何用于在查询中引用/转义值的工具。我正在编写一个使用SQLite作为后端的应用程序,我喜欢使用类似Python's 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编写一个包装器吗?

3 个答案:

答案 0 :(得分:4)

我有一段时间没有看过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

答案 1 :(得分:4)

LuaSQLite3以及对SQLite的任何其他低级绑定都提供带有可变参数的预处理语句;这些使用方法将值绑定到语句参数。由于SQLite不解释绑定值,因此根本不可能进行SQL注入。这是迄今为止最安全(也是表现最佳)的方法。

uroc显示了将bind方法与预处理语句一起使用的示例。

答案 2 :(得分:2)

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

例如使用代码

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

结果是:

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

我实际上试过看看它做了什么。显然,他们的postgres司机也有这样的功能。我通过查看他们的测试找到了这个。

希望这有帮助。