问题

您希望允许不受信任的用户为您网站上的输出提供HTML(例如,作为评论提交)。您需要清理此HTML以避免跨站点脚本(XSS)攻击。

将jsoup HTML [Cleaner](https://jsoup.org/apidocs/org/jsoup/safety/Cleaner.html)与a指定的配置一起使用[Whitelist](https://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html)

  1. String unsafe = "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
  2. String safe = Jsoup.clean(unsafe, Whitelist.basic());
  3. // now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

讨论

针对您网站的跨站点脚本攻击可能会毁了您的一天,更不用说您的用户了。许多站点通过不允许在用户提交的内容中使用HTML来避免XSS攻击:它们仅强制执行纯文本,或使用其他标记语法,如wiki-text或Markdown。这些对用户来说很少是最佳解决方案,因为它们会降低表现力,并迫使用户学习新语法。
更好的解决方案可能是使用富文本WYSIWYG编辑器(如CKEditorTinyMCE)。这些输出HTML,并允许用户直观地工作。但是,它们的验证是在客户端完成的:您需要应用服务器端验证来清理输入并确保HTML可以安全地放置在您的站点上。否则,攻击者可以避免客户端Javascript验证并将不安全的HMTL直接注入您的站点
jsoup白名单清理程序通过解析输入HTML(在安全的沙盒环境中),然后遍历解析树并仅允许已知安全标记和属性(和值)进入清理后的输出来工作。
它不使用不适合此任务的正则表达式。
jsoup提供一系列[Whitelist](https://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html)配置以满足大多数要求; 如有必要,可以对它们进行修改,但请注意。
清洁器是不仅用于避免XSS,而且在限制元件,用户可以提供的范围有用:您可以与文本行[a](https://jsoup.org/apidocs/org/jsoup/select/Evaluator.CssNthEvaluator.html#a)strong元素,但不是结构性divtable元件。

也可以看看

  • 请参阅XSS备忘单和过滤规避指南,作为常规表达式过滤器不起作用的示例,以及为什么基于安全白名单解析器的消毒剂是正确的方法。
  • [Cleaner](https://jsoup.org/apidocs/org/jsoup/safety/Cleaner.html)如果要获取[Document](https://jsoup.org/apidocs/org/jsoup/nodes/Document.html)而不是返回String,请参阅参考
  • 请参阅[Whitelist](https://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html)不同固定选项的参考,以及创建自定义白名单
  • nofollow的链接属性