【发布时间】:2014-08-18 14:13:50
【问题描述】:
我正在尝试使用过滤器来检查响应正文中的 HTML 标记。问题是,如果我更改过滤器中的主体,它在到达客户端时不会更改。我尝试了此处显示的解决方案:Looking for an example for inserting content into the response using a servlet filter 但它没有帮助。
我有两个过滤器。 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 中具有修改后的主体,但在客户端,主体看起来好像从未修改过。
任何建议将不胜感激。谢谢。
【问题讨论】:
标签: java httpresponse servlet-filters