用于嵌套HTML元素的Java XSS Sanitization



我使用Java中的JSoup库来净化输入以防止XSS攻击。它适用于像alert("易受攻击"(这样的简单输入。

示例:

String data = "<script>alert('vulnerable')</script>";
data = Jsoup.clean(data, , Whitelist.none());
data = StringEscapeUtils.unescapeHtml4(data); //StringEscapeUtils from apache-commons lib
System.out.println(data);

输出:""

然而,如果我将输入调整为以下内容,JSoup就无法对输入进行清理。

String data = "<<b>script>alert('vulnerable');<</b>/script>";
data = Jsoup.clean(data, , Whitelist.none());
data = StringEscapeUtils.unescapeHtml4(data);
System.out.println(data);

输出:<script>alert('vulnerable');</script>

这种输出显然仍然容易受到XSS攻击。有没有一种方法可以完全净化输入,从而从输入中删除所有HTML标记?

不确定这是否是最佳解决方案,但一个临时解决方案是将原始文本解析为Doc,然后清除Doc元素及其所有子元素的组合文本:

String unsafe = "<<b>script>alert('vulnerable');<</b>/script>";
Document doc = Jsoup.parse(unsafe);
String safe = Jsoup.clean(doc.text(), Whitelist.none());
System.out.println(safe);

等待其他人提出最佳解决方案。

问题是您正在取消对jsoup制作的安全HTML的捕获。Cleaner的输出是HTML。none安全列表不传递任何标记,只传递文本节点作为HTML。

所以输入:

<<b>script>alert('vulnerable');<</b>/script>

通过清洁器返回:

&lt;script&gt;alert('vulnerable');&lt;/script&gt;

这对于作为HTML呈现是完全安全的。看见https://try.jsoup.org/~hfn2nvIglfl099_dVxLQEPxekqg

只是不要包括unescape行。

最新更新