XSS

211 阅读4分钟

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 &lt;test&gt; string with &quot;quotes&quot; and &amp; 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 内容的情况。
  1. 定义不安全的 HTML 内容unsafeHtml 中包含了一个 <script> 标签,这是一种常见的 XSS 攻击手段。
  2. 使用白名单进行清理:调用 Jsoup.clean() 方法,传入 unsafeHtmlWhitelist.basic() 作为参数,对 HTML 内容进行清理。
  3. 输出结果:打印原始的 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 协议的图片源。