默认情况下,Tomcat的错误页面会显示Tomcat的存在以及处理请求的容器的确切版本。这很适合开发,但在生产环境中,这些信息是一个潜在的安全漏洞,禁用它会很不错。
因此,我想知道最好的(如最简单/最全面的)解决方案是完全抑制Tomcat的默认错误页面。我知道web.xml中的<error-page>
选项,但它似乎在两个所需的计数上都失败了,部分原因是因为我必须多次列出相同的备用错误页面(我想要处理的每个响应代码一个),因为这可能不是100%健壮;如果攻击者能够以某种方式获得我没有明确列出的错误代码,他们将获得默认的错误页面。
理想情况下,设置通用自定义错误页面或者在默认错误页面中禁用发送任何HTML以及错误代码的简单选项将是最佳选择。如果这些选项都不可能,我有兴趣了解实现此功能的典型方法是什么(讨论/显示为什么不存在这些假设选项的奖励点,因为看起来我的要求是非常标准的对于在生产中使用Tomcat的任何人......)。
答案 0 :(得分:6)
<error-page>
是正确答案,但您不希望仅将所有错误代码重定向到某些通用消息。您必须考虑如何处理每个错误。如果您担心可能会错过其中一个代码,请查看HttpServletResponse interface中的常量。
答案 1 :(得分:3)
某些错误由容器直接发送,您的应用程序没有机会处理它们。例如,当请求不存在的资源时,将发送404错误。应用程序可以对其执行某些操作的唯一方法是在web.xml中声明相应的<error-page>
条目。
我同意Jeremy Stein的观点,<error-page>
是正确答案。所有错误代码都不是无限制的。
另请阅读讨论here,了解如何使用Spring MVC处理错误。我认为最重要的是处理自己的错误(例如,如果它们没有被捕获,将导致500内部服务器错误。)
答案 2 :(得分:3)
我同意Jeremy Stein的说法,&lt; error-page&gt;是答案,但我想补充两点:
您应该输入&lt;错误页面&gt;除了应用程序的web.xml文件之外,还有CATALINA_HOME / conf / web.xml文件中的条目,以防黑客试图访问其他网络应用程序中的URL,例如默认安装的“manager”,“tomcat”,例子'等..
如果您想保护服务器,那么(显然)并不像处理这些错误页面那么简单。此链接列出了您需要执行的操作:
答案 3 :(得分:3)
最简单,最全面的方法是使用ErrorReportValve - 只需将以下行添加到server.xml的Host部分(您应该已经拥有AccessLogValve:
<Valve className="org.apache.catalina.valves.ErrorReportValve"
showReport="false"
showServerInfo="false"/>
通过这种方式,您隐藏了服务器信息和(因为可选的showReport = false)堆栈跟踪。
您可以在Security How To和Error Report Valve的文档中详细了解相关信息。
答案 4 :(得分:2)
一个可能的选择是设置一个 Servlet过滤器,它可以将错误页面重定向到您想要的页面...您只需编码一次,它将适用于所有错误码..