XSS攻击及防御

2020-04-11  本文已影响0人  董董呀

什么是XSS?


百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。


分类


  1. 非持久型
  2. 持久型
    • 反射型。发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后
      响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析并执行XSS代码,这个过程
      像一次反射,故叫反射型XSS
    • 存储型。存储型和反射型XSS的差别在于提交的代码会存储在服务器端(数据库、内存、文
      件系统等),下次请求目标页面时不用再提交XSS代码
    • DOM。不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet
      Model,DOM)的一种漏洞,dom - xss是通过url传入参数去控制触发的。

风险


该漏洞可能被攻击者利用窃取或操纵客户会话和Cookie,它们可能用于模仿合法用户,从而使黑客能够以合法用户身份登录系统进行渗透。可执行攻击者恶意脚本。


常用修复方式



缺点



过滤器防御实现

自定义过滤器Filter拦截请求,并对请求参数进行xss过滤处理
 
/**
 *XSS过滤器
 */
public class XssFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //使用包装器
        XSSRequestWrapper XSSRequestWrapper=new XSSRequestWrapper((HttpServletRequest) servletRequest);
        filterChain.doFilter(XSSRequestWrapper,servletResponse);
    }
 
    @Override
    public void destroy() {
 
    }

}
 
/**
 * Request的包装类
 * 
 */
public class XSSRequestWrapper extends HttpServletRequestWrapper {
    private Map <String,String[]> paramsMap = null;
 
    public XSSRequestWrapper(HttpServletRequest request) {
        super(request);
        try {
                request.setCharacterEncoding("UTF-8");
            } catch (UnsupportedEncodingException var8) {
                var8.printStackTrace();
            }

            this.parameterMap = new HashMap();
            Enumeration<String> parameterNames = request.getParameterNames();
            String name = null;
            String[] values = null;

            for(List whiteList = Arrays.asList("headerData"); parameterNames.hasMoreElements(); this.parameterMap.put(name, values)) {
                name = (String)parameterNames.nextElement();
                values = request.getParameterValues(name);
                if (values != null && values.length > 0) {
                    for(int itemId = 0; itemId < values.length; ++itemId) {
                        if (!whiteList.contains(name)) {
                            values[itemId] =htmlEncode(values[itemId]);
                        }
                    }
                }
            }

        }

        public Enumeration<String> getParameterNames() {
            Vector<String> vector = new Vector(this.parameterMap.keySet());
            return vector.elements();
        }

        public Map<String, String[]> getParameterMap() {
            return this.parameterMap;
        }

        public String getParameter(String name) {
            String[] results = (String[])this.parameterMap.get(name);
            return results != null && results.length > 0 ? results[0] : "";
        }

     private static String htmlEncode(String html) {
        String str = getString(html);
        if (!StringUtil.IsEmpty(str)) {
            str = str.replace("&", "&amp;");
            str = str.replace("<", "&lt;");
            str = str.replace(">", "&gt;");
            str = str.replace("\"", "&quot;");
            str = str.replace("'", "&#39;");
            str = str.replace("\"", "&#34;");
        }
        return str;
    }
}
   
上一篇 下一篇

猜你喜欢

热点阅读