How to change servlet request body in java filter?

后端 未结 2 660
清酒与你
清酒与你 2020-12-20 07:24

How can I change request body in java filter to protect from XSS attack? I build HttpServletRequestWrapper and use getparameter for ch

相关标签:
2条回答
  • 2020-12-20 07:57

    Since I do not have enough reputation to add a comment, I am adding it as an answer. After 3 years, I found the accepted answer to save me hours. At the same time, I had to fix couple of things, and hence adding...

    (1) A bug (missing assignment to rawData)

    public void resetInputStream(byte[] newRawData) {
        rawData = newRawData;
        servletStream.stream = new ByteArrayInputStream(newRawData);
    }
    

    (2) A change necessitated over time. Reference: https://stackoverflow.com/questions/29208456/httpservletrequestwrapper-example-implementation-for-setreadlistener-isfinish

    0 讨论(0)
  • 2020-12-20 07:59

    XSSFilter.java

    public class XSSFilter implements Filter {
    
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    
    @Override
    public void destroy() {
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
    
        XSSRequestWrapper wrappedRequest = new XSSRequestWrapper(
                (HttpServletRequest) request);
    
        String body = IOUtils.toString(wrappedRequest.getReader());
    
    
        if(!"".equals(body))
        {
            JSONObject oldJsonObject = new JSONObject(body);
            JSONObject newJsonObject = new JSONObject();
    
            for(String key : oldJsonObject.keySet())
            {
                newJsonObject.put(key, XSSUtils.stripXSS(oldJsonObject.get(key).toString()));
            }
            wrappedRequest.resetInputStream(newJsonObject.toString().getBytes());
    
        }
    
    
        chain.doFilter(wrappedRequest, response);
     }
    }
    

    XSSRequestWrapper .java

    public class XSSRequestWrapper extends HttpServletRequestWrapper {
    
    
    private byte[] rawData;
    private HttpServletRequest request;
    private ResettableServletInputStream servletStream;
    
    public XSSRequestWrapper(HttpServletRequest request) {
        super(request);
        this.request = request;
        this.servletStream = new ResettableServletInputStream();
    }
    
    
    public void resetInputStream(byte[] newRawData) {
        servletStream.stream = new ByteArrayInputStream(newRawData);
    }
    
    @Override
    public ServletInputStream getInputStream() throws IOException {
        if (rawData == null) {
            rawData = IOUtils.toByteArray(this.request.getReader());
            servletStream.stream = new ByteArrayInputStream(rawData);
        }
        return servletStream;
    }
    
    @Override
    public BufferedReader getReader() throws IOException {
        if (rawData == null) {
            rawData = IOUtils.toByteArray(this.request.getReader());
            servletStream.stream = new ByteArrayInputStream(rawData);
        }
        return new BufferedReader(new InputStreamReader(servletStream));
    }
    
    private class ResettableServletInputStream extends ServletInputStream {
    
        private InputStream stream;
    
        @Override
        public int read() throws IOException {
            return stream.read();
         }
       }
     }
    

    XSSUtils .java

    public class XSSUtils {
    
    private XSSUtils()
    {
    
    }
    
    public static String stripXSS(String value) {
        return value == null ? value : escapeHtml4(value);
      }
    }
    
    0 讨论(0)
提交回复
热议问题