首页 > 数据库 >如何用正则表达式过滤用户输入防止SQL注入?

如何用正则表达式过滤用户输入防止SQL注入?

来源:互联网 2026-07-11 08:31:00

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

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

如何用正则表达式过滤用户输入防止SQL注入?

长期稳定更新的攒劲资源: >>>点此立即查看<<<

为什么用正则过滤SQL注入关键词是危险的

攻击者早就不是当年那个老老实实写 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 回溯爆炸
  • 中文截断:PHP 里没加 u 修饰符,preg_match 在 UTF-8 字符串中直接崩溃
  • 大小写漏判:/i 本意是兼容,结果让 selECT 溜过去;不如直接禁用该字段

哪些正则场景勉强可用

正则只在两类地方能派上用场,而且必须配合后端的参数化查询:

  • 前端 JS 表单校验:比如拦截明显畸形输入 ' OR 1=1 --、连续5个以上括号 (((((、裸露分号结尾 ;
  • 日志关键词筛查:从 access.log 或 audit 日志里快速提取疑似攻击片段,比如匹配 /(%27)|(')|(--)|(#)/,用于告警而非阻断

推荐写法示例(PHP):

if (preg_match('/['";--=<>]|--|*//', $input)) {    // 记录日志 + 前端提示,但不拒绝请求    error_log("Suspicious input: " . $input);    echo "输入含非法符号,请检查";}

注意:['";--=] 里的连字符 - 必须放在最后,否则会被解释为范围符;*/ 需要转义。

真正该做的三件事(顺序不能错)

与其纠结“怎么写正则”,不如把精力放在这三步上,防护效果比任何字符串匹配都强:

  • 所有数据库操作统一走 mysqli::preparePDO::prepare,变量全部用 占位符
  • 用户输入进入 SQL 之前,先过 filter_var($input, FILTER_SANITIZE_SPECIAL_CHARS)(PHP 8.1+ 推荐),或者至少用 htmlspecialchars($input, ENT_QUOTES, 'UTF-8')
  • 数据库账号权限最小化——应用账号只给 SELECTINSERT,绝对不要 FILEEXECUTEDROP

正则唯一不可替代的作用,是帮你发现异常输入模式;但它永远没法定义“合法 SQL”。比如 JSON 字段里嵌了 SQL 片段,或者 GraphQL 查询体混了原生语句——这种边界情况只能靠协议层和权限层来兜底。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备2026025700号-3 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。