基于Antisamy项目实现防XSS存储型跨站脚本攻击

项目上线,请第三方公司进行了一次渗透性测试,被发现存在多处XSS攻击。由于我们对于URL的Get请求已经通过URLFilter进行了特殊字符过滤,Get请求的漏洞已经被封堵,但是对于Post请求考虑到我们项目存在表单提交,富文本编辑等功能,不敢贸然的使用Filter对关键字进行过滤。

为了解决上述问题,我们采用了OWASP的一个开源的项目AntiSamy来彻底解决XSS攻击问题。AntiSamy是一个可以确保用户输入的HTML、CSS、JavaScript符合规范的API。它确保了用户无法在HTML中提交恶意代码,而这些恶意代码通常被输入到个人资料、评论等会被服务端存储的数据中。

AntiSamy的下载地址:

 官方网站:https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project

          项目地址:https://code.google.com/p/owaspantisamy/downloads/list

 我们项目使用的Java,除了antisamy-1.5.3.jar包外,还需要下述jar包。



AntiSamy的使用如下:

定义一个XssFilter的Class,该类必须实现Filter类,在XssFilter类中实现doFilter函数。将策略文件放到和pom.xml同级目录下,然后开始编写XssFilter。

public class XssFilter implements Filter {  
@SuppressWarnings("unused")  
private FilterConfig filterConfig;  
public void destroy() {  
    this.filterConfig = null;  
}  
public void doFilter(ServletRequest request, ServletResponse response,  
        FilterChain chain) throws IOException, ServletException {  
    chain.doFilter(new XssRequestWrapper((HttpServletRequest) request), response);  
}  
public void init(FilterConfig filterConfig) throws ServletException {  
    this.filterConfig = filterConfig;  
}     
   }  
我们需要重写request,新建一个类XssRequestWrapper,继承HttpServletRequestWrapper,需要重写getParameter(String param), getParameterValues(String param)以及getHeader(String param)方法,以及过滤非法html方法xssClean()

public class XssRequestWrapper extends HttpServletRequestWrapper {  

    public XssRequestWrapper(HttpServletRequest request) {  
        super(request);  
    }  
      
    @SuppressWarnings({ "rawtypes", "unchecked" })  
    public Map<String,String[]> getParameterMap(){  
        Map<String,String[]> request_map = super.getParameterMap();  
        Iterator iterator = request_map.entrySet().iterator();  
        while(iterator.hasNext()){  
            Map.Entry me = (Map.Entry)iterator.next();  
            //System.out.println(me.getKey()+":");  
            String[] values = (String[])me.getValue();  
            for(int i = 0 ; i < values.length ; i++){  
                //System.out.println(values[i]);  
                values[i] = xssClean(values[i]);  
            }  
        }  
        return request_map;  
    }  
    @SuppressWarnings({ "rawtypes", "unchecked" })  
    public String getHeader(String paramString)  
    {  
      String str = super.getHeader(paramString);  
      if (str == null)  
        return null;  
      return xssClean(str);  
    }  
    @SuppressWarnings({ "rawtypes", "unchecked" })  
    public String getParameter(String name) {  
        String v=super.getParameter(name);  
        if(v==null)  
            return null;  
        return xssClean(v);  
    }  
      
    @SuppressWarnings({ "rawtypes", "unchecked" })  
    public String[] getParameterValues(String name) {  
        String[] v=super.getParameterValues(name);  
        if(v==null || v.length==0)  
            return v;  
        for(int i=0;i<v.length;i++){  
                v[i]=xssClean(v[i]);  
        }  
        return v;  
    }  
  
    private String xssClean(String value) {  
        AntiSamy antiSamy = new AntiSamy();  
        try { 
            
    	    //System.out.println(((HttpServletRequest) getRequest()).getSession().getServletContext().getRealPath(""));
    	    String webUrl=((HttpServletRequest) getRequest()).getSession().getServletContext().getRealPath("");
            Policy policy = Policy.getInstance(webUrl+"/WEB-INF/antisamy-slashdot.xml");  
            final CleanResults cr = antiSamy.scan(value, policy);  
            //安全的HTML输出 
            String str=StringEscapeUtils.unescapeHtml(cr.getCleanHTML());
            str=str.replaceAll((antiSamy.scan(" ",policy)).getCleanHTML(), "");
            //System.out.println("clean:"+str);  
              
            return str;  
        } catch (ScanException e) {  
            e.printStackTrace();  
        } catch (PolicyException e) {  
            e.printStackTrace();  
        }  
        return value;  
    }  
}  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值