Wie verändern sich die Körper der http-Antwort in einem filter

Ich bin versucht, einen filter verwenden, um zu überprüfen, die für HTML-tags in einem response-body. Das problem ist, dass wenn ich zu verändern, den Körper in den filter, es werden nicht verändert, wenn es an den client. Ich habe versucht die Lösung hier gezeigt: Auf der Suche nach einem Beispiel für das einfügen von Inhalt in die Antwort mit einem servlet-filter
aber es hat nicht geholfen.

Habe ich zwei Filter. SecureWrapperFilter umschließt das request/response-Objekte, die in unsere benutzerdefinierte wrapper, und XSSFilter verwendet OWASP Kodieren Kodieren für html-Inhalt. Die Filter wie folgt Aussehen:

public class SecureWrapperFilter implements Filter {

    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response,
        final FilterChain chain) throws IOException, ServletException
    {
        final ServletRequestWrapper securityRequest =
            new ServletRequestWrapper((HttpServletRequest)request);
        final ServletResponseWrapper securityResponse =
            new ServletResponseWrapper((HttpServletResponse)response);
        ESAPI.httpUtilities().setCurrentHTTP(securityRequest, securityResponse);
        chain.doFilter(ESAPI.currentRequest(), ESAPI.currentResponse());
    }

    @Override
    public void destroy() {
    }
}

und:

public class XSSFilter implements Filter {

    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response,
        final FilterChain chain) throws IOException, ServletException
    {      
        final ServletRequestWrapper requestWrapper = (ServletRequestWrapper)request;
        final String body = Encode.forHtmlContent(requestWrapper.getBody());
        requestWrapper.setBody(body);
        chain.doFilter(requestWrapper, response);
        final ServletResponseWrapper responseWrapper = (ServletResponseWrapper)response;
        final byte[] copy = responseWrapper.getCopy();
        final String oldBody = new String(copy, response.getCharacterEncoding());
        final String newBody = Encode.forHtmlContent(oldBody);
        if (!StringUtils.equals(oldBody, newBody)) {
            responseWrapper.getResponse().getOutputStream().write(newBody.getBytes());
        }
    }

    @Override
    public void destroy() {
    }
}

Wenn ich einige debug-Protokollierung kann ich sehen, dass die securityResponse hat der modifizierten Körper im SecureWrapperFilter, aber auf der client-Seite, der Körper sieht aus, als wenn es nicht verändert wurde.

Anregungen würde sehr geschätzt werden. Danke.

InformationsquelleAutor Ben Green | 2014-06-27
Schreibe einen Kommentar