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 ?
我没有看过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
LuaSQLite3以及一个任何其它低水平结合的SQLite提供具有可变参数准备的语句; 这些使用方法来值绑定到语句参数。 由于SQLite不解释绑定值,是根本不存在SQL注入的可能性。 这是迄今为止最安全(和表现最好的)的做法。
uroc示出了使用与准备语句绑定方法的一个例子。
通过在Lua SQL的方式存在于conn的sqlite3的司机无证逃生功能:逃避其中conn是连接变量。
例如与代码
print ("con:escape works. test'test = "..con:escape("test'test"))
其结果是:
con:escape works. test'test = test''test
其实,我试过了,看看它会怎么做。 显然也有其Postgres的司机这样的功能了。 我通过观察他们的测试中发现这一点。
希望这可以帮助。