为了账号安全,请及时绑定邮箱和手机立即绑定

java中的javascript解析器

java中的javascript解析器

至尊宝的传说 2023-08-04 17:38:43
我有一个文本框,可以接受任何文本,包括 html 和嵌入 javascript 的 html。我需要通过在 java 中实现的服务器端 REST API 来验证此数据。基本上我需要通过不允许任何 javascript 数据保存在我的数据库中来进行此验证以避免 XSS 漏洞。当我从服务器端 API 上的上述文本框中接收文本时,如果存在嵌入 java 脚本的 html 文本,则应该抛出错误,但正常的 html 文本应该没问题。示例:在上面的文本框中,<svg onload=alert(document.cookie)/>不允许使用 as 数据,但 <html><h1>this is test</h1></html>允许使用正常的 html 文本。我尝试使用 JSoup,它是一个 HTML 解析库,但我只需要验证该文本中是否存在 javascript,而不是检查 html 标签。任何人都可以建议一种方法来做到这一点。
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

由于您已经使用 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等)中具有值的元素。

  • 每个接受 URL 的属性(hrefsrc等)都可以包含"javascript:"执行 JavaScript 的值。

最后,我建议不要将原始 html 存储到数据库中,即使它通过了您的验证。而是将 JSoup 解析的文档再次转换为 html。通过这种方式,您可以确保您的文档格式良好,不含任何“危险”元素。


查看完整回答
反对 回复 2023-08-04
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信