我有一个文本框,它可以接收任何文本,包括嵌入 javascript 的 html 和 html。
我需要通过在 java 中实现的服务器端 REST API 来验证这些数据。基本上,我需要通过不允许任何 javascript 数据保存在我的数据库中来进行此验证,以避免 XSS 漏洞。
当我从服务器端 API 上的上述文本框接收文本时,如果嵌入了 java 脚本的 html 文本存在,但正常的 html 文本应该可以,它应该会抛出错误。
示例:在上面的文本框中,<svg onload=alert(document.cookie)/>
不允许使用data as ,但允许使用普通的 html text like <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*
属性(onload
,onclick
等)。你在这里有完整的列表,但它可能足以获取所有属性,e.attributes()
如果其中任何一个以"on"
.href
、src
等)的属性都可以包含一个"javascript:"
执行 JavaScript的值。你也应该检查所有这些。有关这些属性的完整 (?) 列表,请查看其他 SO 问题。最后,我建议不要将原始 html 存储到数据库中,即使它通过了您的验证。而是将 JSoup 解析的文档再次转换为 html。通过这种方式,您可以确保您拥有一个格式良好的文档,没有任何“危险”元素。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句