Spring Boot请求体清洗方案:含特殊值的属性处理方法
Spring Boot 请求体特殊值清洗方案
问题背景
在Spring Boot中处理请求体时,常会遇到包含XSS、SQL注入风险的特殊值,比如:
<script>alert(1709881302027)</scipt>;; <script /**/>/**/alert(1709881242160)/**/</script /**/> <IMG onmouseover="alert('xxs')"> ><script>alert(1709881242161)</script> %3Cscript%3Ealert%281%29%3C%2Fscript%3E1709881242161 javascript:alert(1709881302029) 1 OR 1=1 ; -- OR 1 OR 1=1 ; ' OR '1'='1 1 OR 1=1;
常规OWASP库会无差别转义<、'等字符,但像>50000或<232这类和数值搭配的符号不需要转义,需要更精细化的处理方案。
可行解决方案
1. 自定义规则结合OWASP库
利用OWASP ESAPI的编码能力,同时通过正则匹配跳过数值比较场景的符号:
- 编写正则匹配
^\d+[<>]\d+$或^[<>]\d+$、^\d+[<>]$这类数值相关模式,识别无需转义的</>; - 匹配到的内容直接保留,其余内容用OWASP的
ESAPI.encoder().encodeForHTML()等方法编码。
示例代码片段:
import org.owasp.esapi.ESAPI; public class RequestCleaner { private static final String NUM_COMPARE_PATTERN = "^([<>]\\d+|\\d+[<>]|\\d+[<>]\\d+)$"; public String cleanField(String value) { if (value == null) return null; // 匹配数值比较场景,直接返回原内容 if (value.matches(NUM_COMPARE_PATTERN)) { return value; } // 其他场景用OWASP编码 return ESAPI.encoder().encodeForHTML(value); } }
2. 按字段场景分治+白名单策略
根据字段业务用途针对性处理:
- 文本展示字段:用OWASP的HTML编码过滤XSS风险代码,比如移除
<script>标签、on*事件属性、javascript:伪协议; - 数值相关字段:设置白名单,只允许数字、
<、>、=等合法符号,过滤'、OR、--等SQL注入相关内容。
示例:数值字段的白名单过滤
public String cleanNumberField(String value) { if (value == null) return null; // 只保留数字、<、>、=、空格 return value.replaceAll("[^0-9<>= ]", ""); }
3. 专项攻击类型处理
- XSS防御:用正则匹配并移除/编码恶意代码:
public String stripXss(String value) { if (value == null) return null; // 移除含注释混淆的script标签 value = value.replaceAll("<script[^>]*?>.*?</script>", ""); // 移除on事件属性 value = value.replaceAll("on\\w+\\s*=\\s*[\"]?[^\"\"]*[\"]?", ""); // 移除javascript:伪协议 value = value.replaceAll("javascript:\\s*", ""); // 对剩余HTML特殊字符编码 return ESAPI.encoder().encodeForHTML(value); } - SQL注入防御:优先使用MyBatis参数绑定(
#{})避免注入;若必须拼接SQL,用OWASP的encodeForSQL()处理参数,或直接过滤OR、--、UNION等SQL关键字。
注意事项
- 不要依赖单一清洗方案,结合输入验证+输出编码双重保障;
- 定期更新OWASP库版本,规避已知漏洞;
- 复杂业务场景可自定义注解+AOP实现全局请求体清洗,减少重复代码。
内容的提问来源于stack exchange,提问作者Divya
相关产品推荐
相关产品推荐

