如何修复Spring Boot中Fortify检测到的持久型XSS漏洞?
Spring Boot中Fortify检测出XSS错误的修复方案
问题背景
我的Spring Boot应用中,以下代码的最后一行被Fortify检测出XSS错误:
E body; HttpClient client = HttpClient.newHttpClient(); HttpRequest.Builder builder = .... builder.POST(BodyPublishers.ofString((String)body)); return client.send(builder.build(), BodyHandlers.ofString());
错误详情
- 数据通过不可信来源进入Web应用。对于持久型(又称存储型)XSS,不可信来源通常是数据库或其他后端数据存储;对于反射型XSS,不可信来源通常是Web请求。
- 数据被包含在发送给Web用户的动态内容中,未经过验证。
我明白需要验证用户输入并对输出进行编码/净化来修复该问题,请问有推荐的用于净化body变量的库或其他修复方案吗?我考虑使用JsonSanitizer或HtmlUtils.htmlEscape。
修复方案与推荐库
一、根据body内容类型选择对应方案
1. HTML内容场景:用Spring自带的HtmlUtils
如果body是HTML格式内容,直接用Spring框架自带的HtmlUtils.htmlEscape()即可,它会把HTML特殊字符转义为安全的实体字符(比如<转为<),避免浏览器将恶意代码解析为可执行内容。
用法示例:
String sanitizedBody = HtmlUtils.htmlEscape((String)body); builder.POST(BodyPublishers.ofString(sanitizedBody));
优势:无需额外引入依赖,轻量高效,适合简单的HTML转义需求。
2. JSON内容场景:用Google JsonSanitizer
如果body是JSON格式,Google的JsonSanitizer是合适选择,它能清理JSON中的危险片段(比如嵌入的脚本、非法字符),同时保证JSON结构的合法性。
先引入Maven依赖:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <!-- 建议使用最新稳定版本 --> </dependency>
用法示例:
String sanitizedBody = JsonSanitizer.sanitize((String)body); builder.POST(BodyPublishers.ofString(sanitizedBody));
二、更全面的防护:OWASP Java Encoder
如果需要覆盖多种场景(HTML、JSON、URL等),推荐使用OWASP Java Encoder,这是专门为防止注入类漏洞设计的工具,支持多场景的安全编码。
引入Maven依赖:
<dependency> <groupId>org.owasp.encoder</groupId> <artifactId>encoder</artifactId> <version>1.2.3</version> <!-- 建议使用最新稳定版本 --> </dependency>
根据body类型选择编码方法:
- HTML内容:
Encoder.forHtml((String)body) - JSON内容:
Encoder.forJson((String)body) - URL参数:
Encoder.forUriComponent((String)body)
三、输入验证不可忽视
除了输出阶段的编码净化,在数据进入应用时必须做输入验证:
- 若
body是JSON:可以用Jackson的@Valid注解配合DTO类,验证字段的类型、长度、格式是否符合预期,拒绝非法结构的JSON。 - 若需要保留部分合法HTML标签:可以使用OWASP HTML Sanitizer,通过白名单机制允许指定的标签和属性,彻底过滤恶意代码。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

