【问题标题】:How to quote values for LuaSQL?如何引用 LuaSQL 的值?
【发布时间】:2012-12-25 06:50:18
【问题描述】:

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 写一个包装器吗?

【问题讨论】:

    标签: sql sqlite lua sql-injection escaping


    【解决方案1】:

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

    【讨论】:

    • 太棒了。感谢你们俩为我指明了正确的方向,也感谢您提供的说明性示例。我希望我能“接受”这两个答案。
    • 你的意思是用 :bind_names 代替 :bind 吗?
    【解决方案2】:

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

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

    【讨论】:

    • 参数化 sql 语句确实要快得多,因为当你绑定变量时,sqlite 不必重新解析每个 sql 语句来确定执行计划。也可以在这里查看:stackoverflow.com/questions/904796/…
    【解决方案3】:

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

    以代码为例

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

    结果是:

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

    我实际上尝试过这样做,看看它会做什么。显然他们的 postgres 驱动程序也有这样的功能。我通过查看他们的测试发现了这一点。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,这很有用。
    猜你喜欢
    • 2012-06-06
    • 2019-06-17
    • 2012-09-05
    • 2011-02-28
    • 2018-01-28
    • 2017-08-28
    • 2017-08-26
    • 2015-12-16
    相关资源
    最近更新 更多