2017-06-12 18 views
0

我正在構建一個web服務,用戶可以上傳zip文件解壓縮並保存到我們的服務器。是否可以使用Javas File構造函數進行路徑遍歷?

我創建了下面的函數在一個指定的路徑打開文件:

private File secureOpenFile(String fileName, String directorypath){ 
     return new File(directorypath, fileName); 
} 

但安全掃描告訴我,這是不是安全的,因爲它有路徑遍歷的可能性。給出的參數(「../../notsafe」,‘uploadfolder’),將允許惡意攻擊者改寫其他文件...

但是,文件類的文檔中,我發現以下幾點:https://docs.oracle.com/javase/7/docs/api/java/io/File.html#File(java.io.File,%20java.lang.String)

否則,父抽象路徑名被用來表示一個目錄,子路徑名字符串被用來表示目錄或文件。如果子路徑名字符串是絕對的,那麼它將以依賴於系統的方式轉換爲相對路徑名。如果parent是空的抽象路徑名,則通過將child轉換爲抽象路徑名並根據系統相關的默認目錄解析結果來創建新的File實例。否則,每個路徑名字符串都會被轉換爲一個抽象路徑名,並且該子抽象路徑名會根據父級進行解析。

其中我解釋爲:不離開父文件夾。我正確與否?這段代碼安全嗎?如果現在:解決這個安全問題的最好方法是什麼?

+0

你有參數來自用戶的任何輸入? – ProgrammerBoy

+0

嘿ProgrammerBoy。第二個參數,即文件名,來自用戶上傳的zip文件。我懷疑用戶可以在這個zip文件中加入任何奇怪的東西,所以我不相信這個輸入... – rmeertens

回答

1

是的,這是可能的。

...子級抽象路徑名是針對父級解析的。

只是手段解決孩子路徑時父路徑被用作基地,但如果孩子路徑包含..,其結果將是外父。

E.g.

new File("/Users/example/projects/sample/target", "../pom.xml").getCanonicalFile(); 

導致/Users/example/projects/sample/pom.xml,從而外部的target

所以,簡而言之,是的,你需要自己防範這一點。

相關問題