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*
属性(onload
、onclick
等)中具有值的元素。您有完整的列表 here 但它可能足以获取所有带有 e.attributes()
的属性并拒绝其中任何以 "on"
. 开头的属性
- 接受 URL(
href
、src
等)的每个属性都可以包含执行 JavaScript 的 "javascript:"
值。你也应该检查所有这些。有关这些属性的完整 (?) 列表,请查看 this other SO question.
最后,我建议不要将原始 html 存储到数据库中,即使它通过了您的验证。而是将 JSoup 解析的文档再次转换为 html。这样你就可以确保你有一个没有任何 "dangerous" 元素的格式正确的文档。
我有一个文本框,它可以包含任何文本,包括嵌入了 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*
属性(onload
、onclick
等)中具有值的元素。您有完整的列表 here 但它可能足以获取所有带有e.attributes()
的属性并拒绝其中任何以"on"
. 开头的属性
- 接受 URL(
href
、src
等)的每个属性都可以包含执行 JavaScript 的"javascript:"
值。你也应该检查所有这些。有关这些属性的完整 (?) 列表,请查看 this other SO question.
最后,我建议不要将原始 html 存储到数据库中,即使它通过了您的验证。而是将 JSoup 解析的文档再次转换为 html。这样你就可以确保你有一个没有任何 "dangerous" 元素的格式正确的文档。