2017-07-08 167 views
0

目前我的Java代碼使用如何解決開放重定向問題在Java

response.sendRedirect(request.getRequestUrl().toString()); 

這是一個開放的重定向。

我必須解決這個問題,但我不能白名單,因爲有太多的URL與它相關聯。

我試過ESAPI的下列解決方案,但它不會爲我工作。

ESAPI.httpUtilities().setCurrentHTTP(req, resp); 
ESAPI.httpUtilities().sendRedirect(location); 
ESAPI.httpUtilities().clearCurrent(); 

我是ESAPI的新手。

+0

另請參閱OWASP的[未驗證重定向和轉發備忘](https://www.owasp.org/index.php/Unvalidated_Redirects_and_Forwards_Cheat_Sheet)和[重定向和轉發](https://www.owasp.org/index。 PHP/Redirects_and_forwards)。它太糟糕了凱文沃爾不會潛伏在堆棧溢出。他是ESAPI Java人員之一。 – jww

+0

如果你說白名單是一個太大的問題,黑名單更糟。 – avgvstvs

+0

我會監控它(但每週只有一次),並且我看到另一個ESAPI副主管(Matt Seil)已經回覆。 –

回答

0

感謝您的所有建議和意見。 我發現,線

ESAPI.httpUtilities().setCurrentHTTP(req, resp); 
ESAPI.httpUtilities().sendRedirect(location); 
ESAPI.httpUtilities().clearCurrent(); 

現在正在爲我好,長期的鬥爭,我發現我的代碼是使用最新版本的commons-configuration.jar後,但是當我加入ESAPI作爲一個依賴使用的ESAPI舊版本的相同,這是不符合我的代碼,所以我只是排除這從Esapi依賴使用排除在POM和它爲我工作。

1

[免責聲明]

我對ESAPI項目共同領導。

我必須解決這個問題,但我不能白名單它,因爲有太多的與它相關聯 許多URL。

基本上,「我必須解決這個問題,但我限制自己從最簡單的解決方案。」

Here are the best practices enumerated by @jww:

  1. 只需避免使用重定向和轉發。

  2. 如果使用,請不要將url作爲目標的用戶輸入。這通常可以完成。在這種情況下,你應該有一個方法來驗證URL。

  3. 如果無法避免用戶輸入,請確保提供的值有效,適用於應用程序並且已獲得用戶授權。

  4. 建議將任何此類目標輸入映射到一個值,而不是實際的URL或部分URL,並且該服務器端代碼將此值轉換爲目標URL。

  5. 通過創建可信URL(主機列表或正則表達式)來清理輸入。

  6. 強制所有重定向首先通過網頁通知用戶他們要離開您的網站,並讓他們點擊鏈接進行確認。

這幾乎是所有可用的解決方案。一些web框架可以讓你輕鬆實現,比如Spring Security的Spring MVC。

這些行:

ESAPI.httpUtilities().setCurrentHTTP(req, resp); 
ESAPI.httpUtilities().sendRedirect(location); 
ESAPI.httpUtilities().clearCurrent(); 

不要工作,因爲你必須執行重定向前檢查用戶輸入。

1

你一定會希望根據域名將其至少列入白名單。儘可能限制它。例如,如果您的應用託管在https://myApp.example.com/重定向到您網站上的任何地方是可能好吧。(我寫的可能是,因爲如果它可以用作繞過授權檢查的方式,比如在多序列頁面系列上說,那麼它可能並不好,但只要您的常規授權檢查提取並驗證重定向,你通常會沒事的。)但是重定向到https://anotherApp.example.com/呢?那些會好嗎?那麼在「example.com」域中的任何內容呢?他們需要白名單的其他第三方域名?如果是這樣,一定要列出這些網址。但是你想避免的一件事是完全開放的重定向,因此你需要某種類型的白名單。您可以使用ESAPI構建一些自定義驗證器來執行此操作,但在沒有ESAPI的情況下編寫它可能更容易。如果你有一堆你必須白名單的URL,把它們保存在一個不是.war/.ear文件一部分的配置文件中,這樣你就可以輕鬆地更新它,而無需重新部署你的應用程序,只需(重新)讀取配置文件更新時。

希望這會有所幫助。

-kevin