2009-10-05 92 views
10

默認情況下,Tomcat的錯誤頁面會公佈Tomcat的存在以及處理請求的容器的確切版本。這對於開發很好,但是在生產環境中,這些信息是潛在的安全漏洞,禁用它會很好。減少Tomcat中的信息泄露錯誤頁面

因此,我想知道什麼是最好的(如最簡單的/綜合)解決方案是完全抑制Tomcat的默認錯誤頁面。我知道web.xml中的<error-page>選項,但它在所需的計數上似乎都失敗了,部分原因是我必須多次列出相同的備用錯誤頁面(每個響應代碼要處理一個),因爲這可能不是100%穩健的;如果攻擊者能以某種方式得到我沒有明確列出的錯誤代碼,他們將得到默認的錯誤頁面。

理想的情況下,一個簡單的選擇設定一個統一的自定義錯誤頁,或者平了禁止在默認錯誤頁面的錯誤代碼一起發送的任何HTML,將是最好的。如果這兩種選擇都不可行,那麼我有興趣瞭解實現此功能的典型方法(討論/顯示爲什麼這些假設選項不存在,因爲看起來我的要求相當標準對於任何在生產中使用Tomcat的人...)。

回答

5

<error-page>是正確的答案,但您不想只將所有錯誤代碼重定向到某個通用消息。你必須考慮如何處理每個錯誤。如果您擔心可能會錯過其中一個代碼,請查看HttpServletResponse interface中的常量。

+0

但我有點想 - 因爲它是一個獨立的web應用程序,從用戶的角度來看,無論是正在工作或他們不是;他們看到的實際響應實際上可能是通用的(日誌會向技術人員顯示實際問題以及HTTP響應代碼仍然完好無損)。無論如何,接受你的答案是根據Tomcat可能發送的響應代碼的枚舉。 – 2009-10-06 08:02:44

+0

在默認的tomcat安裝中,默認安裝了一堆webapps,例如, 'manager','host-manager','examples','tomcat'。看起來我需要爲這些webapps中的每一個配置這組完整的錯誤代碼,對吧? – 2011-09-07 05:16:37

+0

哦 - 我剛剛發現了CATALINA_HOME/conf/web.xml文件。我已經把放在了那裏,但它仍然是一個問題,因爲我不知道如何讓tomcat找到引用的文件(或放置我的error.html文件的位置)。這意味着黑客會看到不同的結果,具體取決於他是否查詢'/tomcat'與'/foo',它至少會披露我正在使用tomcat。 – 2011-09-07 05:31:30

2

一個可能的選擇是建立一個Servlet過濾器,可能會重定向錯誤頁面來正是你想要的網頁...你只會這個代碼一次,它會工作的所有的錯誤代碼..

+0

一個有趣的方法......我懷疑它可能有點脆弱*和*殺死性能,因爲我需要解析每一個響應,試圖從原始字符中解析出它是否是默認錯誤頁面。還是有更好的方法來識別問題頁面? – 2009-10-05 16:44:24

+2

@dtsazza關於性能,如果您比較了涉及整個請求處理過程的數十個指令中的幾十條指令,則它不到0.1%。 **代碼如此之高時,性能影響可以忽略不計**。 – KLE 2009-10-06 07:22:16

3

一些錯誤是直接由容器發送和您的應用程序不會有機會來對付他們。例如,當請求不存在的資源時,將發送404錯誤。您的應用程序可以做些什麼的唯一方法是在web.xml中聲明合適的<error-page>條目。

我與傑里米·斯坦同意<error-page>是正確的答案。所有的錯誤代碼不是無限的。

閱讀還討論here,有關錯誤是如何與Spring MVC的處理。我認爲最重要的是處理自己的錯誤(如果它們沒有被捕獲,將導致500內部服務器錯誤)。

3

我同意傑里米·斯坦因,即<錯誤頁>是答案,但我想補充兩點:

  1. 你應該把一個<錯誤頁>項在CATALINA_HOME /conf/web.xml文件以及應用程序的web.xml文件,以防黑客嘗試訪問其他Web應用程序中的URL,例如默認安裝的「manager」,「tomcat」,「examples」等。 。

  2. 如果你想確保它的服務器(顯然)不是以汽車作爲簡單e這些錯誤頁面。此鏈接有你需要做的事情的清單:

https://www.owasp.org/index.php/Securing_tomcat

2

要做到這一點,最簡單,最全面的方法是使用ErrorReportValve - 只是以下行添加到您的服務器的主機部分.XML(你應該已經AccessLogValve:

​​

通過這種方式,你都躲在服務器信息和(因爲可選showReport = FALSE)也將堆棧跟蹤

您可以在Security How ToError Report Valve的文檔中閱讀更多信息。