浅谈XSS

    最近在作项目中的漏洞修复工做,在短期内接触到不少关于web开发须要防范的漏洞,例如SQL injection , XSS, CSRF等等,这些漏洞对web开发的项目来讲的破坏仍是比较大的,其实在网上有不少这些漏洞的介绍和防范,像SQL injection这些漏洞的注入已经不多见了。做为一个初学者我认为仍是要可以弄清楚为何会产生这个漏洞,这样才能从原理上理解漏洞的发生,才能更好的去修复它,本文就对XSS漏洞作一个简单的笔记,仅供你们相互交流不断的提高web开发的安全性。javascript

    XSS的全称Cross-site Scripting,夸脚本攻击,其实它的缩写应该是CSS,可是和web开发使用的css重名了,因此就简称为XSS了,该漏洞在web开发中比较常见,下面演示一个XSS漏洞的过程,我本身写了一个很简单的web页面(你们不要拍砖),两个输入框,姓名和我的介绍。css

                     

    web开发中的常见漏洞,通常都发生在这些输入框中,通常状况咱们会对这些输入域进行客户端的校验和服务器端的校验,可是在客户端的校验基本上起不来什么做用,由于客户端的全部代码咱们均可以进行更改,防止漏洞的发生仍是须要服务器端的校验,可是通常服务器端的校验都是校验你输入的字符或者是数字的长度等等。下面就演示一个XSS的漏洞注入,当咱们写入姓名和我的介绍以后,后台代码的处理就是进行一个简单的转发,而后把咱们刚才的信息转发到一个info.jsp页面进行显示,代码以下(不要拍砖):html

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        String username = req.getParameter("username");
        String describe = req.getParameter("describe");
        
        req.setAttribute("username", username);
        req.setAttribute("describe", describe);
        
        req.getRequestDispatcher("/info.jsp").forward(req, resp);
    }

  咱们在输入框中这样输入:java

                        

    你们看一下我的介绍里边写的是一段javascript代码,目前咱们后台没有对javascript代码作任何的处理,直接把输入的信息输出到info.jsp页面,这个时候咱们点击提交按钮,页面跳转到info.jsp页面以后,就坏事了,直接把咱们写的javascript代码运行了,直接弹出 hello world 提示框了。若是咱们在我的介绍写上<script>document.location.href='http://www.baidu.com'</script>,那么提交之就跳转到百度了,若是跳转到xxoo网站呢,这不就坏事了嘛。web

    若是你使用的是chrome 和 firefox浏览器演示例子,会发现不会出现上边的状况,主要缘由是chrome和firefox浏览器进行了拦截,看一下chrome浏览器console中的错误提示:sql

The XSS Auditor refused to execute a script in 'http://127.0.0.1:8080/javaweb/helloworld' because its source code was found within the request. The auditor was enabled as the server sent neither an 'X-XSS-Protection' nor 'Content-Security-Policy' header. helloworld:24

    若是在request的请求和response响应中包含相同的script可执行的脚本,chrome会进行拦截,难道咱们使用chrome浏览器就能够防止XSS的出现吗?答案确定不是这样的,通常状况下咱们会把用户输入的表单内容存到数据库中,而后再查询的时候进行显示,如今让咱们模拟一下查询数据库,显示用户的输入,看看chrome会进行拦截吗?chrome

后台的代码改一下,模拟查询数据库,是模拟:数据库

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        String username = req.getParameter("username");
        String describe = req.getParameter("describe");
        if(username == null || describe == null){
            username ="aaaa";
            describe="helloworld<script>alert('hello world');</script>";
        }
        System.out.println(username +" : "+ describe);
        
        req.setAttribute("username", username);
        req.setAttribute("describe", describe);
        req.getRequestDispatcher("/info.jsp").forward(req, resp);
    }

    在这里咱们直接请求这个servlet而后再info.jsp页面显示信息,这个时候你会发现,咱们  describe="helloworld<script>alert('hello world');</script>";这里的javascript脚本执行了,弹出的hello world 窗口。因此仅仅依靠浏览器防止XSS是不行的。咱们须要本身在后台对这些特殊的字符进行转码,当这些字符再次显示到页面的时候不执行脚本。apache

    使用什么样的方法才能阻止这种状况的发生,就是对HTML 中的预留字符替换为字符实体,例如:对< 进行替换成 &lt,对>替换成&gt  等等。在这里把咱们的代码进行一下完善防止XSS的出现:浏览器

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        String username = req.getParameter("username");
        String describe = req.getParameter("describe");
        if(username == null || describe == null){
            username ="aaaa";
            describe="helloworld<script>alert('hello world');</script>";
        }
        //HTML 中的预留字符必须被替换为字符实体
        username = StringEscapeUtils.escapeHtml4(username);
        describe = StringEscapeUtils.escapeHtml4(describe);
        
        System.out.println(username +" : "+ describe);
        
        req.setAttribute("username", username);
        req.setAttribute("describe", describe);
        
        req.getRequestDispatcher("/info.jsp").forward(req, resp);
    }

    这个时候咱们再次使用chrome浏览器直接访问请求的servlet在info.jsp中显示的结果为:

                  

    这样咱们就能够简单的防止XSS夸脚本攻击,代码中的 StringEscapeUtils是apache common-lang 包下的一个工具类,这个工具类也能够对sql中的保留字符进行转换,同时咱们本身也能够本身实现一个对html中的预留字进行替换的程序。在后台打印的describe的字符已经被替换为:

    helloworld&lt;script&gt;alert('hello world');&lt;/script&gt;  把这些内容显示在html中是不会执行javascript脚本的。

    本人也是刚刚接触XSS漏洞的原理,上边举得例子是目前最简单的例子,一些很深刻的XSS漏洞的方法还须要不断的学习和研究,但愿你们有这方面的资料能够进行一下共享。到此结束。

相关文章
相关标签/搜索