2013-12-03 6 views
2

В настоящее время я изменяю приложение, которое я создал с помощью JSF. Для некоторого фона о том, что я делаю, читайте ниже.JSF 2.0 web.xml код состояния страницы ошибки

фон

Acunetix сканирования обнаружения проблемы безопасности среды под названием «Применение сообщение об ошибке» в большинстве моих страниц, когда он манипулирует значение javax.faces.ViewState. Сканирование Acunetix изменяет состояние представления на случайное значение или пустую строку, которая заставляет мое приложение создавать исключение. Исключения попадают на страницу пользовательских ошибок, используя следующую конфигурацию в файле 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 scan рассматривает это как уязвимость, потому что он видит код состояния 500 в заголовке с сообщением об ошибке Internal Server Error.

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), 7-сервер Tomcat.

Спасибо за вашу помощь ...

+0

Я так не думаю, но самый очевидный вопрос: вы пробовали? То есть, вы изменили 200 до 500 в web.xml? Если да, то это имело желаемый эффект? – EJK

+0

@EJK спасибо за комментарий, но то, что я на самом деле хочу (как обходное решение), для страницы с ошибкой имеет ответный заголовок 200, поскольку он в настоящее время находится на уровне 500. –

+0

@EJK В любом случае я заменил код ошибки на 200 и удалил java .lang.Throwable, поэтому я могу попробовать ваше предложение. Я просто перенаправлен на 404 по умолчанию не на мою страницу пользовательских ошибок, потому что код ошибки не соответствует. –

ответ

1

я решил мою проблему, делая это. На моей странице ошибки я просто добавил слушатель события, который вынудит код состояния 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 I больше не может видеть код ошибки 500.

Надеюсь, это поможет кому-то. Также, если кто-нибудь может указать на какие-либо нежелательные побочные эффекты, пожалуйста, не стесняйтесь публиковать сообщения.

Спасибо за ваше время ...

+0

Я оставлю этот вопрос без ответа в течение нескольких дней, если у кого-то будет лучший ответ. –

+0

Или просто 'ec.setResponseStatus (HttpServletResponse.SC_OK);'. –

+0

Без дополнительной поддержки:

0

Вы должны быть в состоянии добавить сервлет фильтр, который безоговорочно устанавливает все коды ответа 200.

  1. Зарегистрируйте свой фильтр в web.xml следующим образом:

    < filter>

    <filter-name>StatusCodeFilter</filter-name> 
    
        <filter-class>com.foo.StatusCodeFilter</filter-class> 
    

    < /filter>

  2. В методе doFilter вашего класса фильтра, установите код ответа следующим образом:

    @Override 
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
         throws IOException, ServletException { 
    
          ((HttpServletResponse)response).setStatus(HttpServletResponse.SC_OK); 
    
+0

Привет, просто протестировал вашу идею, к сожалению, она не работает. Как мне также нужно вызвать метод chain.doFilter(). если я установил статус до chain.dofilter(), код состояния будет перезаписан. Я также попытался установить код состояния после того, как поймал ошибку, вызванную chain.dofilter(), которая все еще перезаписана. Я предполагаю, что он перезаписан в applicationfilter или errorvalve из tomcat, если я повторно создаю исключение. Если я не повторяю исключение, код статуса устанавливается в 200, но отображается только пустая страница, а не пользовательская страница ошибок. У тебя есть другие идеи?? –

Смежные вопросы