我正在尝试使用过滤器来检查响应正文中的HTML标签。问题是,如果我更改过滤器中的主体,则到达客户端时它不会被更改。我尝试了此处显示的解决方案:寻找一个使用servlet过滤器将内容插入响应中的示例,但这没有帮助。
我有两个过滤器。SecureWrapperFilter
将请求/响应对象包装在我们的自定义包装器中,并XSSFilter
使用OWASP编码对html内容进行编码。过滤器如下所示:
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() {
}
}
和:
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() {
}
}
如果添加一些调试日志记录,则可以看到securityResponse
SecureWrapperFilter中具有已修改的主体,但是在客户端,该主体看起来好像从未修改过。
任何建议将不胜感激。谢谢。
问题是在我的XSSFilter中,我将新的响应正文附加到旧的响应正文上。这导致无效的json像{"x"="y"}{"escapedx"="escapedy")
我们的客户端反序列化器仅打印第一个json对象,因此{"x"=y"}
我们在客户端看到的内容也是如此。
要解决此问题,我将以下行添加到XSSFilter:
responseWrapper.getResponse().resetBuffer();
前
responseWrapper.getResponse().getOutputStream().write(newBody.getBytes());
这将清除缓冲区,使我可以在下面的行上对其进行重写。我在客户端的json现在看起来像:{"escapedx"="escapedy"}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句