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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
War das problem, dass in meinem XSSFilter, war ich anfügen das neue response-body auf den alten. Dies verursachte ungültige json wie
{"x"="y"}{"escapedx"="escapedy")
Unserer client-deserializer war nur das drucken des ersten json-Objekt, so
{"x"=y"}
war alles, was wir waren, zu sehen auf der client-Seite.Um dieses problem zu beheben, habe ich noch die folgende Zeile, um die XSSFilter:
bevor
Diese löscht die Puffer, die es mir erlaubt zu umschreiben, dass es auf der Linie unten. Meine json-auf der client-Seite sieht nun folgendermaßen aus:
{"escapedx"="escapedy"}
Müssen Sie sicherstellen, dass die HttpResponse-gepuffert ist. Wenn der Puffer nicht groß genug ist, dann ist die response wird zum client gestreamt befire Ihre filter aufgerufen wird.
Oder vielleicht die servler ist der Aufruf von flush() auf die Antwort?
responseWrapper.flushBuffer()
zum Ende der XSSFilter, aber es hasn ' T einen Unterschied gemacht. Das ist der einzige Ort, wo flushBuffer() aufgerufen wird.Rücksendung json getan werden kann, mit jackson: