减少Tomcat错误页面中的信息披露

减少Tomcat错误页面中的信息披露,tomcat,error-handling,web-config,Tomcat,Error Handling,Web Config,默认情况下,Tomcat的错误页面会显示Tomcat的存在以及处理请求的容器的确切版本。这对于开发来说很好,但是在生产环境中,这些信息是一个潜在的安全漏洞,最好禁用它 因此,我想知道最好的(最简单/全面的)解决方案是完全抑制Tomcat的默认错误页面。我知道web.xml中的选项,但它似乎在两个期望的计数上都失败了,部分原因是我必须多次列出相同的可选错误页(我想处理的每个响应代码都有一个错误页),而且我觉得这可能不是100%可靠;如果攻击者能够以某种方式返回我没有明确列出的错误代码,他们将获得默

默认情况下,Tomcat的错误页面会显示Tomcat的存在以及处理请求的容器的确切版本。这对于开发来说很好,但是在生产环境中,这些信息是一个潜在的安全漏洞,最好禁用它

因此,我想知道最好的(最简单/全面的)解决方案是完全抑制Tomcat的默认错误页面。我知道web.xml中的
选项,但它似乎在两个期望的计数上都失败了,部分原因是我必须多次列出相同的可选错误页(我想处理的每个响应代码都有一个错误页),而且我觉得这可能不是100%可靠;如果攻击者能够以某种方式返回我没有明确列出的错误代码,他们将获得默认错误页面


理想情况下,最好使用一个简单的选项来设置一个通用的自定义错误页面,或者干脆在默认错误页面中禁用发送任何HTML以及错误代码。如果这两个选项都不可能实现,我会有兴趣找出实现此功能的典型方式(讨论/显示这些假设选项不存在的原因的加分,因为我的要求对于在生产中使用Tomcat的任何人来说都是非常标准的…)。。。您只需编写一次此代码,它适用于所有错误代码。

是正确的答案,但您不希望将所有错误代码重定向到某个通用消息。您必须考虑如何处理每个错误。如果您担心可能会丢失其中一个代码,请查看中的常量。

一些错误是由容器直接发送的,您的应用程序没有机会处理它们。例如,当请求不存在的资源时,将发送404错误。应用程序对此所做的唯一方法是在web.xml中声明适当的
条目

我同意Jeremy Stein的观点,
是正确的答案。毕竟,所有的错误代码都不是无限的


还可以阅读关于如何使用SpringMVC处理错误的讨论。我认为最重要的是处理您自己的错误(如果他们没有被发现,例外情况将导致500个内部服务器错误)。

我同意Jeremy Stein的观点,这就是答案,但是我想补充两点:

  • 除了应用程序的web.xml文件外,您还应该在CATALINA_HOME/conf/web.xml文件中添加一个条目,以防黑客试图访问其他web应用程序中的URL,如默认安装的“manager”、“tomcat”、“examples”等

  • 如果您想保护服务器,那么(显然)就没有处理这些错误页面那么简单。此链接列出了您需要执行的操作:


  • 最简单、最全面的方法是使用ErrorReportValve,只需将以下行添加到server.xml的主机部分(您应该已经有了AccessLogValve):

    <Valve className="org.apache.catalina.valves.ErrorReportValve"
        showReport="false" 
        showServerInfo="false"/>    
    
    
    
    这样,您就隐藏了服务器信息和堆栈跟踪(因为可选的showReport=false)


    您可以在和的文档中了解更多关于这方面的信息。

    这是一种有趣的方法……我怀疑它可能有点脆弱,会降低性能,因为我需要解析每个响应,以尝试从原始字符中确定它是否为默认错误页。或者是否有更好的方法来识别问题页?@dtsazza关于性能,如果你将整个请求处理过程中涉及的几十条指令与几十万条指令进行比较,那么这一数字不到0.1%。当代码达到如此高的水平时,性能影响可以忽略不计。但我确实有点想——因为从用户的角度来看,这是一个自包含的webapps是否正常工作;他们看到的实际响应确实可以是通用的(日志将向技术人员显示实际问题以及HTTP响应代码仍然完整)。根据Tomcat可能发送的响应代码的枚举,接受您的回答。在默认的Tomcat安装中,默认情况下安装了一组Web应用程序,例如“manager”、“host manager”、“examples”、“Tomcat”。看起来我需要用这些Web应用程序中的每一个配置这整套错误代码,对吗?哦-我刚刚发现了CATALINA_HOME/conf/web.xml文件。我已经将的放在那里了,但这仍然是一个问题,因为我不知道如何让tomcat找到引用的文件(或者把我的error.html文件放在哪里)这意味着黑客会看到不同的结果,这取决于他是查询“/tomcat”还是“/foo”,这至少表明我在使用tomcat。