一、跨站脚本攻击(XSS)——00

1、攻击原理:

  程序代码  +  用户输入的数据  =  网页产生相应的结果

  如果用户输入的数据中包含了程序代码,会改变原有的程序逻辑,达到攻击的目的(目的是啥?嘿嘿你猜)。

2、攻击类型:

  反射型:攻击代码写在URL中,当用户点击后触发代码。

  存储型:攻击代码被保存到网站的数据库中,当用户访问时触发代码。

3、攻击位置:

  3.1 HTML节点内容

  3.2 HTML属性

  3.3 javaScript代码

  3.4 富文本

  详解(红色字体代表相应的内容):

  HTML节点:

    div中的内容是动态生成的:<div>#{content}</div>,如果把内容变成代码就可以达到攻击目的:<div><script>alert('我的小宝贝,我们是一对!');</script></div>

  HTML属性:

    img中的路径是动态生成的:<img src="#{image}"/>,同样把内容变成代码来达到攻击目的:<img src="1.png" onerror="alert('我的小宝贝,我们是一对!')"/>

  javaScript代码:

    data使用来自服务器提供的数据:<script> var data = "#{data}" </script>,返回的数据有问题:<script> var data = "He ";alert('我的小宝贝,我们是一对!')"" </script>

  富文本:

    富文本向数据库提交的是HTML代码: <div><b>加粗了</b><img src="1.png"/></div>,同样的我们可以修改相关的内容和属性达到我们的目的。

4、防御XSS的方案:

  4.1 浏览器自带的检测功能:主要防御反射型攻击,可以防御HTML节点和HTML属性的攻击方式。(不可依赖)

  4.2.1 对内容进行转义:对HTML的节点内容或属性进行转义(确定用户输入的内容不含有HTML的格式,只包含文本)。转义的时机有两种,一个是在用户提交内容的时候进行转义,另一个是从数据库读取数据的时候进行转义。 

function escapeString(str){
            if(!str)return '';
            str = str.replace(/&/g, '&amp;'); /*在HTML5之前,按惯例是要对'&'进行转义,HTML5之后可以不写,这个转义只能是第一个转义字符,如果放到下面,会把下列转义字符中的&一同给转义掉。*/
            str = str.replace(/</g, '&lt;');
            str = str.replace(/>/g, '&gt;');
            str = str.replace(/"/g, '&quto;');
            str = str.replace(/'/g, '&#39;');
            /*str = str.replace(/ /g, '&#32');因为HTML属性可以不加单双引号,那样的话就需要加上' '空格的转义,但是HTML中会自动折叠空白,也就是说会把好几个空格当做一个空格使用,如果把空格进行转义,有可能会对视觉效果进行一定的影响,所以尽量给HTML属性值加上引号*/
       return str;
}

  4.2.2 对内容进行转义:对javaScript的内容进行转义。

     方案一:类似上面对HTML的转义对JS内容进行转义。(因为用户输入可能性太多,不推荐)

function escapeJS(str){
    if(!str)return '';
    str = str.replace(/\\/g, '\\\\'); /*斜杠也需要转义所以写成\\,所以后面写成\\\\,因为用户可能输入'\'更改我们的转义符号,所以需要把斜杠也给转义,由于后面双引号的转义也用到斜杠,所以这个语句写到最前面 */

    str = str.replace(/"/g, '\\"'); /*斜杠也需要转义所以写成\\" */    
 return str; 
}

     方案二:转化成json  (终极办法)

      在后台对返回的数据进行转义:data: JSON.stringify(data)

      同时修改前端代码:<script> var data = #{data} </script>

  4.3 过滤富文本(一般选择输入时进行过滤,过滤比较耗时影响性能,输入时过滤对性能的影响不大,如果是输出的时候进行过滤,有可能会对性能造成一定影响)

    4.3.1 按照黑名单进行过滤(选择你要去掉的东西,不推荐):实现简单,但HTML是个庞大的系统,很可能留下漏洞

    4.3.2  按照白名单进行过滤(选择你要留下的东西):实现较复杂,但不容易出错

 

posted @ 2019-04-02 09:07  道鼎金刚  阅读(641)  评论(0)    收藏  举报