先说一个很多开发者容易踩的坑:正则表达式本身并不能真正防住SQL注入。它最多在前端做个提示,或者在日志里筛一筛异常——真正要在数据库执行前把恶意输入拦下来,唯一靠谱的方案是 mysqli::prepare 或 PDO::prepare 参数化查询。下面这张图虽然看起来挺唬人,但光靠正则,漏洞该在还是
mysqli::prepare 或 PDO::prepare 参数化查询。下面这张图虽然看起来挺唬人,但光靠正则,漏洞该在还是会在。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
攻击者早就不是当年那个老老实实写 SELECT 的人了。现在他们会用 sel/**/ect、%27(URL编码的单引号)、UNI/**/ON,甚至双写绕过 SELESELECTCT——这些都能轻松跳过 /union|select|drop/i 这类规则。更麻烦的是,用 preg_replace 直接删除匹配内容,会破坏合法字段。比如用户昵称叫“Union Jack”,删完就变成“Jack”;而删掉 WHERE 后面的空格,还可能触发 MySQL 的 strict mode 报错。
常见错误现象包括:
PREG_BACKTRACK_LIMIT_ERROR:超长输入加上贪婪匹配(比如 .*),导致 PCRE 回溯爆炸u 修饰符,preg_match 在 UTF-8 字符串中直接崩溃/i 本意是兼容,结果让 selECT 溜过去;不如直接禁用该字段正则只在两类地方能派上用场,而且必须配合后端的参数化查询:
' OR 1=1 --、连续5个以上括号 (((((、裸露分号结尾 ;/(%27)|(')|(--)|(#)/,用于告警而非阻断推荐写法示例(PHP):
if (preg_match('/['";--=<>]|--|*//', $input)) { // 记录日志 + 前端提示,但不拒绝请求 error_log("Suspicious input: " . $input); echo "输入含非法符号,请检查";}
注意:['";--=] 里的连字符 - 必须放在最后,否则会被解释为范围符;* 和 / 需要转义。
与其纠结“怎么写正则”,不如把精力放在这三步上,防护效果比任何字符串匹配都强:
mysqli::prepare 或 PDO::prepare,变量全部用 占位符filter_var($input, FILTER_SANITIZE_SPECIAL_CHARS)(PHP 8.1+ 推荐),或者至少用 htmlspecialchars($input, ENT_QUOTES, 'UTF-8')SELECT、INSERT,绝对不要 FILE、EXECUTE 或 DROP正则唯一不可替代的作用,是帮你发现异常输入模式;但它永远没法定义“合法 SQL”。比如 JSON 字段里嵌了 SQL 片段,或者 GraphQL 查询体混了原生语句——这种边界情况只能靠协议层和权限层来兜底。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述