如何开发SQL注入防护过滤器 实现恶意HTTP请求拦截阻断
SQL注入防护过滤器实现方案

你要实现的HTTP请求拦截检测能力可以按照以下步骤落地:
1. 请求捕获层实现
根据你的业务技术栈选两种部署模式即可:
- 反向代理模式:在业务服务前端部署独立的代理层,所有客户端请求先经过代理再转发到后端服务。你可以基于Nginx的
ngx_http_lua_module扩展写Lua检测逻辑,也可以用Go/Java自研轻量反向代理服务,这种模式对后端业务无侵入,支持多语言业务栈统一接入。 - 服务端内置过滤器模式:如果是单一技术栈的业务,直接用框架原生的拦截能力即可:
- Java生态:实现Servlet Filter或者Spring MVC的HandlerInterceptor
- Python生态:使用Django中间件、Flask请求装饰器
- Node.js生态:实现Express/Koa的中间件
无论用哪种模式,都需要完整解析HTTP请求的所有用户可控字段:URL查询参数、Form表单参数、JSON/XML请求体、Cookie、自定义请求头,避免遗漏攻击 payload 传入的位置。
2. SQL注入特征检测逻辑
检测逻辑可以从易到难逐步迭代:
- 初级版本:用正则匹配常见注入特征,检测前先对参数做URL解码、Unicode解码、注释清除等归一化处理,避免绕过。常见匹配特征包括单引号/双引号闭合符、
UNION、SELECT、OR 1=1、EXEC、xp_cmdshell等SQL关键字的大小写变形、注释插入变形。
以下是Java版简单的过滤器示例:public class SqlInjectFilter implements Filter { // 配置注入特征正则,开启大小写不敏感匹配 private static final Pattern INJECT_RULE = Pattern.compile("(.*')|(\\b(select|union|insert|delete|update|drop|exec|xp_cmdshell)\\b)", Pattern.CASE_INSENSITIVE); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; // 遍历所有请求参数检测 Enumeration<String> paramNames = req.getParameterNames(); while (paramNames.hasMoreElements()) { String paramValue = req.getParameter(paramNames.nextElement()); if (INJECT_RULE.matcher(paramValue).find()) { // 检测到恶意特征直接返回403阻断 ((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN, "Illegal Request"); return; } } chain.doFilter(request, response); } } - 优化版本:引入SQL语法解析能力,把参数值代入SQL语法树检测,如果参数可以构造出额外的SQL查询/操作逻辑,判定为恶意请求,这种方案的误报率远低于正则匹配。
3. 拦截与日志处理
检测到恶意请求后,直接终止请求转发,给客户端返回403状态码即可,同时建议记录攻击日志,包含请求IP、请求路径、命中的规则、请求参数、时间戳,方便后续的攻击溯源和规则优化。
注意事项
- 该过滤器是防御SQL注入的补充手段,不能替代后端的预编译SQL、参数绑定等核心防御逻辑,避免规则被绕过导致防护失效
- 规则需要定期更新,覆盖新出现的注入绕过手法
- 正式上线前要做充分的业务测试,避免规则误杀正常业务请求,影响业务可用性
内容的提问来源于stack exchange,提问作者jithin
相关产品推荐
相关产品推荐

