我正在修改使用JSF创建的应用程序。有关我正在做的事情的一些背景,请阅读以下内容。
背景
Acunetix扫描在操作javax.faces.ViewState的值时,在我的大多数页面中检测到称为“应用程序错误消息”的中等安全问题。 Acunetix扫描将viewstate更改为随机值或空字符串,导致我的应用程序抛出异常。使用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扫描将此视为漏洞,因为它在标头中看到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&amp; FullAjaxExceptionHandlerFactory),Tomcat 7服务器。
感谢您的帮助......
答案 0 :(得分:2)
通过这样做我解决了我的问题。在我的错误页面中,我刚刚添加了一个强制状态代码为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>
在我的managedBean
中@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.
我希望这有助于某人。如果有人可以指出任何不良副作用,请不要犹豫发布。
感谢您的时间......
答案 1 :(得分:0)
您应该能够添加一个无条件地将所有响应代码设置为200的servlet过滤器。
在web.xml中注册过滤器,如下所示:
&LT; filter
&GT;
<filter-name>StatusCodeFilter</filter-name>
<filter-class>com.foo.StatusCodeFilter</filter-class>
&LT; /filter
&GT;
在过滤器类的doFilter方法中,按如下方式设置响应代码:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
((HttpServletResponse)response).setStatus(HttpServletResponse.SC_OK);