Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何引用LuaSQL的值?_Sql_Sqlite_Lua_Sql Injection_Escaping - Fatal编程技术网

如何引用LuaSQL的值?

如何引用LuaSQL的值?,sql,sqlite,lua,sql-injection,escaping,Sql,Sqlite,Lua,Sql Injection,Escaping,,它似乎是Lua中大多数SQL数据库系统的规范库,似乎没有任何在查询中引用/转义值的功能。我正在编写一个使用SQLite作为后端的应用程序,我希望使用如下指定的接口: 但我甚至愿意接受更愚蠢的东西,比如: conn:execute("select * from stocks where symbol=" + luasql.sqlite.quote(t)) 是否有其他Lua库支持对SQLite进行引用?(似乎没有)或者我遗漏了一些关于LuaSQL的信息?我担心滚动我自己的解决方案(使用正则表达式

,它似乎是Lua中大多数SQL数据库系统的规范库,似乎没有任何在查询中引用/转义值的功能。我正在编写一个使用SQLite作为后端的应用程序,我希望使用如下指定的接口:

但我甚至愿意接受更愚蠢的东西,比如:

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

是否有其他Lua库支持对SQLite进行引用?(似乎没有)或者我遗漏了一些关于LuaSQL的信息?我担心滚动我自己的解决方案(使用正则表达式或其他东西)并出错。我应该为它编写一个包装器吗?

我已经有一段时间没有看过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
与SQLite的任何其他低级绑定一样,SQLite提供了带有可变参数的准备语句;它们使用方法将值绑定到语句参数。由于SQLite不解释绑定值,因此根本不可能进行SQL注入。这是迄今为止最安全(也是性能最好)的方法


uroc展示了一个将绑定方法与准备好的语句一起使用的示例。

顺便说一句,在LuaSQL中,conn:escape中的sqlite3驱动程序有一个未记录的escape函数,其中conn是一个连接变量

例如代码

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

con:escape works. test'test = test''test
我真的试过了,想看看它能做什么。显然,他们的博士后司机也有这样的功能。我通过查看他们的测试发现了这一点


希望这能有所帮助。

参数化sql语句确实快得多,因为在绑定变量时,sqlite不必重新分析每条sql语句来确定执行计划。这里也可以看到:太棒了。谢谢你们两位为我指出了正确的方向,也谢谢你们举了一个说明性的例子。我希望我能“接受”这两个答案。你的意思是使用:bind_名称而不是:bind?谢谢,这非常有用。
con:escape works. test'test = test''test