我当前正在修改使用 JSF 创建的应用程序。有关我正在做的事情的一些背景,请阅读下文。
背景
当 Acunetix 扫描操作 javax.faces.ViewState 的值时,它会在我的大多数页面中检测到名为“应用程序错误消息”的中等安全问题。 Acunetix 扫描将 View 状态更改为随机值或空字符串,导致我的应用程序引发异常。自定义错误页面使用 web.xml 文件中的以下配置捕获异常。
<error-page>
<error-code>500</error-code>
<location>/unhandled.xhtml</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/unhandled.xhtml</location>
</error-page>
这按预期工作并显示自定义错误页面。但是,Acunetix 扫描将此视为漏洞,因为它在 header 中看到 500 状态代码以及错误消息“内部服务器错误”。
Acunetix 扫描摘录
/webapp/login.xhtml
Details
URL encoded Post input javax.faces.ViewState was set to
Error message found: Internal Server Error
问题:
是否可以将错误页面的状态代码更改为 200 而不是 500。如果没有,任何人都可以建议一种解决方法,让我能够操作页面状态代码。
注意:
请注意,我使用以下框架 Spring、JSF 2.0、Primefaces 3.4、Hibernate、Omnifaces(FacesEceptionFilter 和 FullAjaxExceptionHandlerFactory)、Tomcat 7 服务器。
感谢您的帮助...
最佳答案
我通过这样做解决了我的问题。在我的错误页面中,我刚刚添加了一个事件监听器,将状态代码强制设置为 200。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<f:view contentType="text/html">
<f:metadata>
<f:event type="preRenderView" listener="#{errorController.forceStatusCode200()}"></f:event>
</f:metadata>
<h:body>
<h1>ZZZZZZZZZ</h1>
</h:body>
</f:view>
</html>
在我的托管Bean中
@component("errorController")
@Scope("view")
public class ErrorController
{
public void forceStatusCode200()
{
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
HttpServletResponse hp = (HttpServletResponse) ec.getResponse();
hp.setStatus(HttpServletResponse.SC_OK);
}
}
通过执行此操作,当我使用 Fiddler 检查响应的状态代码时,我将不再看到错误代码 500。
我希望这对某人有帮助。另外,如果有人可以指出任何不良副作用,请随时发布。
感谢您的宝贵时间...
关于java - JSF 2.0 web.xml 错误页面状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341269/