XSS攻击,相关代码
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;
public class JsoupCleanExample {
public static void main(String[] args) {
```
// 包含 XML 实体转义的字符串
String escapedString = "This is a <test> string with "quotes" and & symbol.";
// 使用 unescapeXml 方法进行还原
String unescapedString = StringEscapeUtils.unescapeXml(escapedString);
// 输出还原后的字符串
System.out.println("Escaped String: " + escapedString);
System.out.println("Unescaped String: " + unescapedString);
// 包含不安全脚本的 HTML 内容
String unsafeHtml = "<p>这是一段 <script>alert('XSS 攻击')</script> 不安全的 HTML。</p>";
// 使用 basic 白名单进行清理
String safeHtml = Jsoup.clean(unsafeHtml, Safelist.basic());
System.out.println("原始 HTML: " + unsafeHtml);
System.out.println("清理后的 HTML: " + safeHtml);
}
执行结果:
原始 HTML: This is a <test> string with "quotes" and & symbol.
清理后的 HTML: This is a <test> string with "quotes" and & symbol.
代码逐行解释
Jsoup.clean(value, whitelist); 是 Jsoup 库中的一个重要方法调用,下面详细解释其作用、参数含义以及实际应用场景。
作用概述
Jsoup.clean() 方法主要用于对 HTML 字符串进行清理和过滤,它会移除其中不安全的标签、属性和代码,只保留白名单中允许的部分,从而有效防止跨站脚本攻击(XSS)等安全风险,确保处理后的 HTML 内容是安全可使用的。
参数解释
value:这是一个字符串类型的参数,表示需要进行清理的原始 HTML 内容。这个内容可能包含用户输入的富文本信息、从网络抓取的 HTML 片段等,其中可能存在恶意脚本或不安全的标签。whitelist:它是Whitelist类型的对象,代表一个白名单,定义了哪些 HTML 标签和属性是允许保留的。Jsoup 提供了多种预定义的白名单,同时也支持自定义白名单。
预定义白名单示例
Whitelist.none():不允许任何 HTML 标签,会将所有标签都移除,只保留纯文本内容。Whitelist.simpleText():只允许简单的文本格式标签,如<b>、<i>、<u>、<s>等,用于基本的文本样式。Whitelist.basic():允许一些基本的 HTML 标签和属性,如<a>、<img>等,适用于需要展示图片和链接的场景,但会对属性进行严格限制。Whitelist.relaxed():允许更丰富的 HTML 标签和属性,提供了较为宽松的过滤规则,适合需要展示复杂 HTML 内容的情况。
- 定义不安全的 HTML 内容:
unsafeHtml中包含了一个<script>标签,这是一种常见的 XSS 攻击手段。 - 使用白名单进行清理:调用
Jsoup.clean()方法,传入unsafeHtml和Whitelist.basic()作为参数,对 HTML 内容进行清理。 - 输出结果:打印原始的 HTML 内容和清理后的 HTML 内容,可以看到
<script>标签被移除,只保留了安全的部分。
实际应用场景
- 用户输入过滤:当网站允许用户输入富文本内容时,使用
Jsoup.clean()方法可以确保用户输入的内容不包含恶意脚本,提高网站的安全性。 - 数据抓取处理:在从网络上抓取 HTML 内容时,可能会包含一些不必要或不安全的标签和代码,使用该方法可以对抓取的内容进行清理,只保留需要的部分。
通过使用 Jsoup.clean() 方法,可以有效地保护应用程序免受 XSS 攻击,同时确保展示的 HTML 内容符合预期的格式和安全性要求。
1. 初始白名单配置
Safelist whitelist = Safelist.none().addTags("font").addAttributes("font","style");
-
Safelist.none():创建一个初始的白名单,这个白名单不允许任何 HTML 标签通过过滤,即默认情况下会过滤掉所有 HTML 标签。 -
.addTags("font"):向白名单中添加font标签,意味着在富文本数据处理时,font标签会被保留下来。 -
.addAttributes("font","style"):为font标签添加style属性,即允许font标签带有style属性,这样在过滤后的富文本中,像<font style="color:red;">这样的标签和属性组合会被保留。
2. 根据请求 URL 调整白名单
if(requestURL.indexOf("/advice/query") != -1){
whitelist = Safelist.basicWithImages().addProtocols("img","src","data");
cleanEvent = false;
}
requestURL.indexOf("/advice/query") != -1:检查请求的 URL 中是否包含 /advice/query` 字符串。如果包含,则表示当前请求是特定的富文本查询请求,需要使用不同的白名单规则。
-
Safelist.basicWithImages():创建一个包含基本 HTML 标签和图片标签的白名单。basicWithImages()是 Jsoup 库提供的一个预定义白名单,它允许一些基本的 HTML 标签(如<a>、<b>、<i>等)以及<img>标签通过过滤。 -
.addProtocols("img","src","data"):为<img>标签的src属性添加data协议支持。在 HTML 中,data协议可以用于嵌入内联的图像数据,通过添加这个协议支持,允许富文本中的<img>标签使用data协议的src属性值,例如<img src="data:image/png;base64,...">。 -
cleanEvent = false:将cleanEvent变量设置为false,这里的cleanEvent应该是一个自定义的标志变量,用于控制后续处理过程中的某些逻辑,具体含义需要结合代码的上下文来确定。
总结
这段代码根据请求的 URL 不同,动态地配置了不同的富文本过滤白名单,以满足不同场景下的安全需求。在一般情况下,只允许 font 标签及其 style 属性;当请求 URL 包含 /advice/query 时,则使用更宽松的白名单,允许基本标签、图片标签以及 data 协议的图片源。