You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字节数组中的HTML转义问题——XSS安全隐患及正确处理咨询

问题分析与解决方案

你的问题出在全量转义了所有HTML特殊字符——原本用来构建页面结构的<、>等标签符号被转成了&#60;、&#62;这类实体字符,浏览器会把这些实体当成纯文本显示,自然不会解析HTML结构,CSS样式也就无法生效。

为什么你的代码会失效

你写的replaceXssCharacters方法把整个HTML字符串里的所有特殊字符都转义了,比如原本的<div class="container">会被转成&#60;div class=&#34;container&#34;&#62;,浏览器完全识别不出这是一个DOM元素,只能原样输出文本。

正确的处理方式

XSS防护的核心是区分可信内容和不可信内容,不是一刀切转义所有字符,分三种场景处理:

1. HTML内容本身可信(比如系统生成的固定页面)

如果你的HTML是系统自己生成的,没有混入用户输入的不可信内容,那根本不需要转义,直接返回即可:

String x = IOUtils.toString(getPdf(), "UTF-8");
return ResponseEntity.ok().contentType(MediaType.TEXT_HTML).body(x);

2. HTML中包含用户输入的不可信内容

只需要对用户输入的部分进行转义,不要碰原本的HTML结构:

// 假设userInput是用户提交的内容,需要嵌入到可信的HTML模板里
String safeUserInput = replaceXssCharacters(userInput);
// 把转义后的用户内容插入到模板的对应位置
String finalHtml = trustedHtmlTemplate.replace("{{USER_CONTENT}}", safeUserInput);
return ResponseEntity.ok().contentType(MediaType.TEXT_HTML).body(finalHtml);

这里你的replaceXssCharacters方法是适合处理纯文本输入的,不要用它处理完整的HTML。

3. 需要清理整个HTML中的危险内容(比如包含不可信的HTML代码)

如果你的HTML来源不确定,需要过滤掉<script>、onclick这类危险标签和属性,应该用专业的HTML清理库,比如OWASP Java HTML Sanitizer:

  • 先引入依赖(Maven):
<dependency>
    <groupId>org.owasp.html</groupId>
    <artifactId>owasp-java-html-sanitizer</artifactId>
    <version>20230619.1</version>
</dependency>
  • 然后编写清理代码:
import org.owasp.html.PolicyFactory;
import org.owasp.html.Sanitizers;

// 定义允许保留的标签组:比如格式化标签、块级标签、样式标签
PolicyFactory safeHtmlPolicy = Sanitizers.FORMATTING
        .and(Sanitizers.BLOCKS)
        .and(Sanitizers.STYLES);

String x = IOUtils.toString(getPdf(), "UTF-8");
// 清理危险内容,保留安全的HTML结构
String secureX = safeHtmlPolicy.sanitize(x);
return ResponseEntity.ok().contentType(MediaType.TEXT_HTML).body(secureX);

关键提醒

  • 手动转义只适合处理纯文本,不能用来处理完整的HTML结构,否则会破坏页面的DOM和样式。
  • 自己写的转义逻辑很难覆盖所有XSS场景,专业库能处理更多边缘情况,比如伪协议、事件属性等。

内容的提问来源于stack exchange,提问作者k.kbr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:05:18