【技术总结】使用Filter进行XSS过滤

一般来说,系统进行表单数据处理时都需要解决类似XSS攻击以及转义这样的问题,这样的问题具有普遍性,不可能在每个提交表单数据的处理中都加入重复的处理代码。通常通过 Filter 或 Interceptor 来拦截处理。

这里介绍下通过 Filter 进行XSS过滤的方法。

大致流程
流程:使用Filter拦截请求,将普通请求转化为包装过的可以处理XSS的自定义请求,之后获取参数时都会经过XSS处理。

主要实现类:

XssFilter

public class XssFilter implements Filter {

    private static final String[] EXCLUDE_URIS = new String[] {
            "/archivefiles/ajaxsimpleupload"// 上传全文
            , "/archivefiles/ajaxuploadannex"// 上传附件
            , "/importfilelist"// 导入文件
            , "/export"// 导出文件
    };

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String reqURI = UrlUtils.getReqURI(req);

        // 默认是需要进行XSS过滤的,当请求为排除的URI时,替换为原来的request
        ServletRequest newRequest = new XsslHttpServletRequestWrapper((HttpServletRequest) request);
        for (String excludeUri : EXCLUDE_URIS) {
            if (reqURI.contains(excludeUri)) {
                newRequest = request;
                break;
            }
        }
        chain.doFilter(newRequest, response);
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void destroy() {
    }
}

XssHttpServletRequestWrapper

/**
 * xss 通过重写参数获取方法实现.
 */
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

  HttpServletRequest xssRequest = null;

  public XsslHttpServletRequestWrapper(HttpServletRequest request) {
    super(request);
    xssRequest = request;
  }

  @Override
  public String getParameter(String name) {
    String value = super.getParameter(name);
    if (value != null) {
      value = xssReplace(value);
    }
    return value;
  }

  @Override
  public String[] getParameterValues(String name) {
    String[] values = super.getParameterValues(name);
    if (values != null && values.length > 0) {
      for (int i = 0; i < values.length; i++) {
        values[i] = xssReplace(values[i]);
      }
    }
    return values;
  }

  @Override
  public String getHeader(String name) {
    String value = super.getHeader(name);
    if (value != null) {
      value = xssReplace(value);
    }
    return value;
  }

  private String xssReplace(String value) {
    String reslut = "";
    if (JacksonUtils.isJsonObjectOrJsonArray(value)) {
      reslut = XssUtils.transferJson(value);
    } else {
      // 对参数值进行过滤.
      reslut = XssUtils.xssReplace(value);
    }
    return reslut;
  }
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、什么是XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。 二、XSS漏洞的危害 (1)网络钓鱼,包括盗取各类用户账号; (2)窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作; (3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等; (4)强制弹出广告页面、刷流量等; (5)网页挂马; (6)进行恶意操作,例如任意篡改页面信息、删除文章等; (7)进行大量的客户端攻击,如DDoS攻击; (8)获取客户端信息,例如用户的浏览历史、真实IP、开放端口等; (9)控制受害者机器向其他网站发起攻击; (10)结合其他漏洞,如CSRF漏洞,实施进一步作恶; (11)提升用户权限,包括进一步渗透网站; (12)传播跨站脚本蠕虫等; 三、过滤器配置 web.xml配置 XssFilter com.xxx.Filter.XssFilter XssFilter /*
XSS(跨站脚本)攻击是一种常见的web漏洞,攻击者通过在web页面中注入恶意脚本来获取用户的敏感信息或控制用户的浏览器。为了防止XSS攻击,我们需要对用户输入的内容进行过滤和转义。 在Java中,可以使用Filter来实现XSS过滤。具体实现如下: 1. 创建一个Filter类,实现javax.servlet.Filter接口。 2. 在doFilter方法中,获取HttpServletRequest对象,并使用XSS过滤工具对用户输入的参数进行过滤。 3. 在过滤完成后,将HttpServletRequest对象传递给FilterChain对象,继续处理请求。 下面是一个简单的XSS过滤Filter的实现: ``` public class XSSFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; // 对参数进行XSS过滤 Map<String, String[]> parameterMap = req.getParameterMap(); for (String key : parameterMap.keySet()) { String[] values = parameterMap.get(key); for (int i = 0; i < values.length; i++) { values[i] = XSSUtils.stripXSS(values[i]); } parameterMap.put(key, values); } // 继续处理请求 chain.doFilter(req, resp); } public void destroy() { // 销毁操作 } } ``` 在上述代码中,XSSUtils.stripXSS方法是XSS过滤工具类的实现,可以使用第三方库或自己实现。在这里,我们使用了OWASP ESAPI库中的XSS过滤方法: ``` public class XSSUtils { public static String stripXSS(String value) { if (value != null) { // 使用ESAPI库进行XSS过滤 value = ESAPI.encoder().canonicalize(value); value = ESAPI.encoder().encodeForHTML(value); } return value; } } ``` 通过以上实现,我们就可以在web应用程序中使用XSS过滤Filter来防止XSS攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值