使用gsub转义SQL特殊字符后仍报字符转义错误该如何解决?
问题原因
- 转义叠加导致单引号实际未被转义:你在Lua替换规则中定义的
\\'会被Lua解析为\'(1个反斜杠+1个单引号),但后续你将处理后的字符串放入了JSON结构,JSON序列化时会自动把反斜杠再次转义为\\,最终拼入SQL的内容实际为\\'。SQL解析时会将第一个反斜杠视为第二个反斜杠的转义符,最终单引号没有被转义,直接闭合了SQL语句的字符串边界,触发语法错误。 - 转义规则不符合SQL标准:MySQL/MariaDB支持反斜杠转义但属于非标准语法,一旦数据库开启
NO_BACKSLASH_ESCAPES模式,反斜杠会被识别为普通字符,转义直接失效。单引号的标准SQL转义方式为两个连续单引号''。 - 手动拼接SQL的方式本身存在缺陷:自定义转义函数很难覆盖所有特殊场景,天生存在SQL注入风险。
修复方案
临时修复:调整转义规则
改用标准SQL的双单引号转义逻辑,同时避免将转义后的字符串先经过JSON序列化再拼接SQL,修改后的转义函数如下:function escape_sqli(source) local replacements = { ['"'] = '""', ["'"] = "''" } return source:gsub( "['\"]", replacements ) end最优修复:使用预处理语句
放弃手动拼接SQL的方式,直接使用数据库驱动提供的预处理语句(Prepared Statement)能力,通过占位符传递参数,由数据库底层自动处理参数转义,从根源上避免语法错误和SQL注入风险。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

