2012-03-16 47 views
2

Fortify在進行新的文件(路徑)比較的行上給出了路徑操作錯誤。我正在使用Struts 2.修復路徑操作錯誤

任何人可以告訴我如何解決這個問題,以便fortify不會給這個錯誤?

private boolean filePresent(String fileName) { 
    if (fileName != null) { 
     String path = getDirPath(); 
     if (path != null) { 
      path = path.endsWith("/") ? path : path + "/"; 
      path = path + fileName; 
      if (new File(path).exists()) { 
       setFileName(fileName); 
       return true; 
      } 
     } 
    } 
    return false; 
} 

我需要看文件是否在我們的網站服務器&所以我傳遞文件名作爲參數,正從web.xml中的整個目錄路徑,附加到文件名&存在或不然後編寫路徑&,根據File對象檢查它是否存在。

回答

4

您不希望遠程Web用戶查看C:/ Windows/System32是否存在,或者/ etc/hosts是否存在,因爲這允許他們在您的服務器上進行取證研究。

您可能沒有意識到您的函數允許他們這樣做,通過在輸入字符串中包含適當數量的「..」序列。

有兩種方法可以停止這個問題:

  1. 白名單的做法。擦除輸入參數中的所有字符,只允許「a」到「z」或許「」。如果輸入超出這些界限,則拋出異常。

1a。或者,如果您知道有效文件列表少於20個,請將其列出,如果輸入不完全匹配,則拋出異常。

  1. 黑名單方法。檢查輸入並拋出異常,如果它包含任何序列「..」或任何正斜槓或反斜槓。這通常不是深度防守,但是對於我現在閱讀它的功能而言,這可以。
0

你甚至可以使用過濾器來做到像

在過濾

chain.doFilter(new RequestWrapper((HttpServletRequest) request), response); 

在RequestWarper使用類似

if(value.contains("..\\")) 
value = value.replace("..\\", ""); 
     if(value.contains("../")) 
      value = value.replace("../", ""); 
     if(value.contains("./")) 
      value = value.replace("./", "");