LuaSQLite3如何采用预编译防sql注入
在工作中碰到了一个防sql注入的问题需要处理(我明明是前端开发啊,真是难为我了QAQ)。所以在此简单介绍一下处理过程。毕竟目前LuaSQLite3相关的防注入文章还是比较少的。
我们先来看看LuaSQLite3的英文文档(对,他没有中文文档,难啃啊~)当中预编译相关的内容:
db:prepare()
db:prepare(sql)
This function compiles the SQL statement in string sql into an internal representation and returns this as userdata. The returned object should be used for all further method calls in connection with this specific SQL statement.
简单翻译就是:此函数将字符串'sql'中的SQL语句进行编译操作,并将其作为userdata返回。返回的对象应用于与此特定SQL语句相关的所有进一步方法调用。
所以,这只是初步开始。
他还需要配合其他的方法使用:那便是以stmt
开头的一众方法。
首先来看看stmt的运行机制图吧,这将使你更快速地了解如何编写代码。
我就不多赘述了。当你需要预编译时需要进行这样的一套流程:
-
prepare:对sql语句进行编译操作,此时sql语句中的参数可以用"?"来代替。
-
bind:将参数绑定到sql语句的"?"中。
-
step:执行sql语句,可以用来执行例如插入(insert)等不需要获取数据库中的数据的操作。(查询数据的例子我会在下面的代码中写出)
-
finalize:结束这个预编译(推荐每个预编译的sql语句执行完都结束一下,以免冗余报错)
好了,现在你应该大概了解了整个流程,那么代码该怎么编写呢?
log:error('----开始测试----')
-- 这是一个简单的布尔盲注~
local values = "ad' OR TRUE--"
-- 先拼写sql语句
local query = "SELECT * FROM web_log WHERE userName LIKE '%' || ? || '%'"
-- 编译拼写的sql语句,用stmt来接受生成的对象
local stmt = _db:prepare(query)
-- 绑定参数,返回一个SQLite3的结果码(下面会附上结果码表噢)
-- 你可以用这个返回值来判断是否执行成功
local res = stmt:bind_values(values)
-- 如果是insert之类的操作可以直接用这个方法噢 ↓
-- local fres = stmt:step()
-- 如果是select之类的操作可以用这个方法噢,因为我需要对每一条返回的数据进行处理所以就用stmt:nrows()~
-- 同理,他也会返回一个SQLite3的结果码,可以用来判断是否执行成功噢
for a in stmt:nrows() do
--打出结果
log:error(a)
end
-- 结束预编译
stmt:finalize()
log:error('--------以上为预编译------')
-- 作为对比,我们来看看直接执行拼接的函数会怎么样
log:error('============以下为注入=========')
local inject = "SELECT * FROM web_log WHERE userName LIKE '%' ||"..values.."|| '%'"
for b in _db:nrows(inject) do
log:error(b)
end
log:error('-------------===注入!!===-------------')
我们来看看执行结果,嗯,完美防住了sql注入!
注意:不能声明一个变量来接受stmt:nrows()的值,这会导致报错:local res = stmt:nrows()
以上就是LuaSQLite3如何采用预编译防sql注入的方法了,推荐配合转义使用,这样才能最有效地预防sql注入。
此外,还有很多stmt方法可以使用,或许你能发现更方便的方法,推荐去LuaSQLite3的英文文档了解更多~
因为笔者还不太熟悉LuaSQLite3,如有疏漏欢迎指出,敬请谅解~
附:
结果码:
OK: 0 ERROR: 1 INTERNAL: 2 PERM: 3 ABORT: 4
BUSY: 5 LOCKED: 6 NOMEM: 7 READONLY: 8 INTERRUPT: 9
IOERR: 10 CORRUPT: 11 NOTFOUND: 12 FULL: 13 CANTOPEN: 14
PROTOCOL: 15 EMPTY: 16 SCHEMA: 17 TOOBIG: 18 CONSTRAINT: 19
MISMATCH: 20 MISUSE: 21 NOLFS: 22 FORMAT: 24 RANGE: 25
NOTADB: 26 ROW: 100 DONE: 101