Ajax请求XSS过滤器

时间:2016-02-18 16:57:39

标签: java ajax filter request xss

在我们的应用程序中,我们有一个XSS过滤器,可以处理每个请求并检查值..

但是我们发现了一个请求是Ajax并且我们的过滤器不起作用的情况。

当AJAX请求完成时,它不起作用:

$.ajax({
            url:         '${someUrl}' ,
            type:        'POST',
            cache:        false,
            data:        JSON.stringify(checkForm),
            dataType:    'json',
            contentType: 'application/json',

这里的值是JSON格式,如下所示:

{"poNumber":"123144","voucher":"","quoteNumber":"","collectNumber":"","otherCarrier":"","deliveryMethodCode":"21","paymentMethodCode":"invoice","concerns":""}

在以下时间确实有效:

ACC.pg = {
    addToCart: function() {
        var productCode = $(this).data("productcode");
        var params = {
            "productCodePost": productCode,
            "qty": 1
        };
        $.post("${url}", params, ACC.quickordercustom.handleSuccess);

数量= 1&安培; productCodePost = 12123

过滤器从请求中获取参数,如

  Map<String,String[]> params = req.getParameterMap();
  for (Map.Entry<String,String[]> entry : params.entrySet()) {
    String v[] = entry.getValue();
    ....
  }

但对于案例1,req.getParameterMap()为空..有任何建议吗?

由于 ÿ

3 个答案:

答案 0 :(得分:1)

servlet请求的参数从URL参数中填充 - 如果是带有内容类型application/x-www-form-urlencoded的POST请求 - 来自解析的请求正文。

由于您在案例1中发送JSON有效负载,因此参数映射为空。

答案 1 :(得分:0)

如果有人感兴趣的话,我就是这样做的。

正如在“wero”的评论中说的那样,params是从url或者请求者体中填充的,取决于方法(POST或GET)..

所以,在我的情况下,我有JSON对象,我需要阅读,执行stripXSS并再次包装它和doFilter ..

这就是我识别Ajax请求的方式

final HttpServletRequest httpServletRequest = ((HttpServletRequest) paramServletRequest);
    final boolean ajax = "XMLHttpRequest".equals(httpServletRequest.getHeader("X-Requested-With"));

所有这些都在Filter中进行,接下来是读取JSON对象并执行stripXSS

    private String jsonToString(final HttpServletRequest httpServletRequest) throws IOException
{
    final StringBuilder buffer = new StringBuilder();
    final BufferedReader reader = httpServletRequest.getReader();
    String line;
    while ((line = reader.readLine()) != null)
    {
        buffer.append(line);
    }
    final String data = buffer.toString();
    return data;
}

还有stripXSS,其中paterns在配置文件中定义

    private String stripXSS(String value)
{
    if ((value != null) && (value.length() > 0))
    {
        for (final Pattern scriptPattern : patterns)
        {
            value = scriptPattern.matcher(value).replaceAll("");
        }
    }
    return value;
}

在请求已经消耗之后,我们需要将其包装起来,以便其他消费者能够阅读它。

    public class AjaxXSSRequestWrapper extends HttpServletRequestWrapper
{

    private final ServletInputStream inputStream;

    /**
     * @param request
     */
    public AjaxXSSRequestWrapper(final HttpServletRequest request, final ServletInputStream inputStream)
    {
        super(request);
        this.inputStream = inputStream;
    }

    /*
     * (non-Javadoc)
     *
     * @see javax.servlet.ServletRequestWrapper#getInputStream()
     */
    @Override
    public ServletInputStream getInputStream() throws IOException
    {
        return this.inputStream;
    }
}

在此示例中,只覆盖了getInputStream,但您也可以为其他方法执行此操作。

最后......

paramFilterChain.doFilter(requestWrapper, paramServletResponse);

答案 2 :(得分:0)

使用JSR-303和@SafeHtml将表单值转换为对象后,您始终可以清除它们。

点击此处查看示例:How to Modify QueryParam and PathParam in Jersey 2