簡體   English   中英

Java中的JavaScript解析器

[英]javascript parser in java

我有一個文本框,可以接受任何文本,包括html和嵌入javascript的html。

我需要通過在Java中實現的服務器端REST API驗證此數據。 基本上,我需要通過不允許任何JavaScript數據保存在數據庫中來避免XSS漏洞,從而進行此驗證。

當我從服務器端API上的上述文本框中收到文本時,如果存在嵌入有Java腳本的html文本,則應該拋出錯誤,但正常的html文本應該可以。

示例:在上面的文本框中,不允許使用<svg onload=alert(document.cookie)/>數據,但允許使用<html><h1>this is test</h1></html>類的普通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等)中帶有值的元素。 您在這里有完整的列表但這可能足以通過e.attributes​()獲取所有屬性,並拒絕任何以"on"開頭的屬性。
  • 每個接受URL的屬性( hrefsrc等)都可以包含執行JavaScript的"javascript:"值。 您也應該檢查所有這些內容。 有關這些屬性的完整(?)列表,請檢查此其他SO問題

最后,我建議不要將原始html存儲到數據庫中,即使它通過了您的驗證。 而是再次將JSoup解析的文檔轉換為html。 這樣,您可以確保文件格式正確,沒有任何“危險”元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM