2013-02-21 120 views
4

我期待爲我的網站的用戶提供對JAR文件中提供的一些靜態資源的訪問。如何在使用Class.getResource()時防止路徑遍歷攻擊()

我無法提供用戶應該能夠訪問所有文件的列表,但我可以保證,他們都包含在JAR的子目錄中,如:

public-access/file-1 
public-access/file-2 
public-access/sub-dir/file-3 

的文件將通過以下方式訪問:

this.getClass().getResource("/public-access/" + requestedFile); 

是否有推薦的方法來防止路徑穿越攻擊?這是爲了防止惡意用戶請求一個叫做例如../secret,或sub-dir/../../secret

+0

我正在尋找一個解決這一點。有趣的是,我不能在路徑中使用「../」來製造這樣的攻擊。也許它正在被Java中的某個地方過濾掉。你是否設法自己執行攻擊? – Zero3 2015-03-19 23:49:15

回答

1

看一看安全管理:http://docs.oracle.com/javase/tutorial/essential/environment/security.html

我認爲它支持正是你需要的,只是指定給開放路徑的資源是不允許的。

+0

看起來我需要在自定義安全管理器中實現'checkRead()'。這需要驗證一個'FileDescriptor'實例,以確保所請求的絕對路徑在我允許的路徑內。有兩個問題 - 首先,我必須自己編寫路徑解析和驗證功能,我期望有很多邊緣案例,其次,每個JVM都有一個'SecurityManager',這意味着我必須限制通過我的整個應用程序訪問,而不是僅僅在我擔心的'getResource()'調用中訪問,這似乎並不理想。 – Armand 2013-02-21 12:48:26

+0

如上所述,您不需要繼承'SecurityManager'。應該可以寫一個策略文件。 – 2013-02-21 19:10:51

+0

@Alison您正在查看'SecurityManager.checkRead'的錯誤超載。 /當你在一個類型上調用一個方法時,你無法控制實現,你可能想在調用方法之前進行任何驗證。 – 2013-02-21 19:13:25

1

您需要的是通過覆蓋SecurityManager來定義自定義安全策略。 查看本教程,很好地解釋瞭如何創建一個和註冊。

Providing Your Own Security Manager

希望這有助於

+0

感謝您的指針。上面的@Jakub適用相同的註釋 – Armand 2013-02-21 12:49:02

+0

您不需要繼承'SecurityManager'。應該可以寫一個策略文件。 – 2013-02-21 19:09:19