javajava 中的脚本解析器

javascript parser in java

我有一个文本框,它可以包含任何文本,包括嵌入了 java 脚本的 html 和 html。

我需要通过在 java 中实现的服务器端 REST API 验证此数据。基本上我需要通过不允许任何 java 脚本数据保存在我的数据库中来避免 XSS 漏洞。

当我从服务器端 API 的上述文本框接收文本时,如果 html 嵌入了 java 脚本的文本存在但正常 html 文本应该没问题。

示例:在上面的文本框中,不应允许 <svg onload=alert(document.cookie)/> 数据,但应允许正常的 html 文本 <html><h1>this is test</h1></html> 是允许的。

我尝试使用 JSoup,它是一个 HTML 解析库,但我只需要验证 javascript 是否存在于该文本中,而不是检查 html 标签。

任何人都可以建议一种方法来做到这一点。

由于您已经使用 JSoup 解析 HTML,下一步是遍历每个元素以检查它们是否包含 Javascript。像这样的代码会检查每个元素:

boolean validateHtml(String html) {
  Document doc = Jsoup.parse(html);
  for(Element e : doc.getAllElements()) {
      if(detectJavascript(e)) {
          return false;
      }
  }
  return true;
}

private boolean detectJavascript(Element e) {
  if(/* Check if element contains javascript */) {
      return true;
  }
  return false;
}

然后,您应该在 detectJavacript 函数中执行几项检查:

  • 当然拒绝script个元素:e.normalName​() == "script"
  • 拒绝在任何 on* 属性(onloadonclick 等)中具有值的元素。您有完整的列表 here 但它可能足以获取所有带有 e.attributes​() 的属性并拒绝其中任何以 "on".
  • 开头的属性
  • 接受 URL(hrefsrc 等)的每个属性都可以包含执行 JavaScript 的 "javascript:" 值。你也应该检查所有这些。有关这些属性的完整 (?) 列表,请查看 this other SO question.

最后,我建议不要将原始 html 存储到数据库中,即使它通过了您的验证。而是将 JSoup 解析的文档再次转换为 html。这样你就可以确保你有一个没有任何 "dangerous" 元素的格式正确的文档。