必须用过滤器+黑名单,因为@valid注解仅校验格式而非内容安全,无法拦截onerror=alert(1)或' or '1'='1等语义型攻击;过滤器工作在servlet最前端,统一处理所有请求入口,并通过html解码、小写归一、正则匹配(含大小写不敏感与绕过变形)实现可靠防护。

在 Java Web 项目中,仅靠注解式参数校验(如 @NotBlank、@Pattern)无法覆盖 XSS 和 SQL 注入这类语义型攻击。真正有效的做法是:在请求进入业务逻辑前,用过滤器统一拦截所有参数,结合黑名单词库做预处理——不是替代参数校验,而是补上它缺失的“内容安全”一环。
为什么必须用过滤器+黑名单,而不是只靠 @Valid
注解校验只管格式,不管内容意图。比如:
- @Pattern(regexp = "^[a-zA-Z0-9_]+$") 能拦住 <script></script>,但拦不住 onerror=alert(1) 这种绕过正则的内联事件;
- @Size(max = 50) 对 admin'-- 或 1 or 1=1 完全无效。
而过滤器工作在 Servlet 层最前端,对所有 request.getParameter()、getParameterMap()、getInputStream() 等入口统一生效,不依赖 Controller 层是否加了注解。
黑名单词库要覆盖的关键攻击模式
词库不是简单列几个关键词,需按攻击类型分层设计:
- XSS 相关:
