如何在过滤器中更改http响应的正文

本·格林

我正在尝试使用过滤器来检查响应正文中的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() {
    }
}

如果添加一些调试日志记录,则可以看到securityResponseSecureWrapperFilter中具有已修改的主体,但是在客户端,该主体看起来好像从未修改过。

任何建议将不胜感激。谢谢。

本·格林

问题是在我的XSSFilter中,我将新的响应正文附加到旧的响应正文上。这导致无效的json像{"x"="y"}{"escapedx"="escapedy")

我们的客户端反序列化器仅打印第一个json对象,因此{"x"=y"}我们在客户端看到的内容也是如此。

要解决此问题,我将以下行添加到XSSFilter:

responseWrapper.getResponse().resetBuffer();

responseWrapper.getResponse().getOutputStream().write(newBody.getBytes());

这将清除缓冲区,使我可以在下面的行上对其进行重写。我在客户端的json现在看起来像:{"escapedx"="escapedy"}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

AngularJS:如何在过滤器中使用$ http

来自分类Dev

播放框架在过滤器中获取响应状态代码

来自分类Dev

如何在过滤器中更改http响应的正文

来自分类Dev

如何在过滤器中获取请求

来自分类Dev

在Eclipse中,如何在过滤器上的键键入结束后刷新视图?

来自分类Dev

如何在过滤器中加密响应数据

来自分类Dev

如何知道过滤器正在过滤什么?

来自分类Dev

如何在过滤器()java8中使用peek()?

来自分类Dev

如何在Zuul帖子过滤器中获取响应正文?

来自分类Dev

如何在过滤器其余部分中获取Cookie

来自分类Dev

如何搜索不在过滤器中的JIRA问题

来自分类Dev

如何使用elasticsearch在过滤器中实现精确匹配?

来自分类Dev

如何在过滤器方法中返回与&&在回调函数中加入的布尔值?

来自分类Dev

dplyr:如何根据特定行在过滤器功能中的位置包括这些行?

来自分类Dev

如何在过滤器中访问projectstage

来自分类Dev

如何在过滤器中访问Application或ViewHandler

来自分类Dev

如何在过滤器数据表中使用全局过滤器

来自分类Dev

如何在Oracle中的解释计划中更改要访问的过滤器

来自分类Dev

我如何在过滤器中获取请求

来自分类Dev

如何删除不在过滤器中的行

来自分类Dev

如何在过滤器中获取AngularJS控制器

来自分类Dev

如何在过滤器函数内部访问React组件的this.state?

来自分类Dev

AngularJS:如何在过滤器中正确使用Math.pow

来自分类Dev

如何在过滤器[Flex]内获取父数组?

来自分类Dev

如何在Java过滤器中更改servlet请求正文?

来自分类Dev

如何在过滤器Angular JS中传递两个参数?

来自分类Dev

在 AngularJS 中,如何在过滤器过滤函数中使用参数?

来自分类Dev

如何在java中的过滤器中读取HttpResponse.sendredirect(“url”)方法的响应?

来自分类Dev

如何检查请求的 URL 是否是 servlet(在过滤器中)?

Related 相关文章

  1. 1

    AngularJS:如何在过滤器中使用$ http

  2. 2

    播放框架在过滤器中获取响应状态代码

  3. 3

    如何在过滤器中更改http响应的正文

  4. 4

    如何在过滤器中获取请求

  5. 5

    在Eclipse中,如何在过滤器上的键键入结束后刷新视图?

  6. 6

    如何在过滤器中加密响应数据

  7. 7

    如何知道过滤器正在过滤什么?

  8. 8

    如何在过滤器()java8中使用peek()?

  9. 9

    如何在Zuul帖子过滤器中获取响应正文?

  10. 10

    如何在过滤器其余部分中获取Cookie

  11. 11

    如何搜索不在过滤器中的JIRA问题

  12. 12

    如何使用elasticsearch在过滤器中实现精确匹配?

  13. 13

    如何在过滤器方法中返回与&&在回调函数中加入的布尔值?

  14. 14

    dplyr:如何根据特定行在过滤器功能中的位置包括这些行?

  15. 15

    如何在过滤器中访问projectstage

  16. 16

    如何在过滤器中访问Application或ViewHandler

  17. 17

    如何在过滤器数据表中使用全局过滤器

  18. 18

    如何在Oracle中的解释计划中更改要访问的过滤器

  19. 19

    我如何在过滤器中获取请求

  20. 20

    如何删除不在过滤器中的行

  21. 21

    如何在过滤器中获取AngularJS控制器

  22. 22

    如何在过滤器函数内部访问React组件的this.state?

  23. 23

    AngularJS:如何在过滤器中正确使用Math.pow

  24. 24

    如何在过滤器[Flex]内获取父数组?

  25. 25

    如何在Java过滤器中更改servlet请求正文?

  26. 26

    如何在过滤器Angular JS中传递两个参数?

  27. 27

    在 AngularJS 中,如何在过滤器过滤函数中使用参数?

  28. 28

    如何在java中的过滤器中读取HttpResponse.sendredirect(“url”)方法的响应?

  29. 29

    如何检查请求的 URL 是否是 servlet(在过滤器中)?

热门标签

归档