You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 11:09:04