一、跨站脚本攻击(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, '&'); /*在HTML5之前,按惯例是要对'&'进行转义,HTML5之后可以不写,这个转义只能是第一个转义字符,如果放到下面,会把下列转义字符中的&一同给转义掉。*/ str = str.replace(/</g, '<'); str = str.replace(/>/g, '>'); str = str.replace(/"/g, '&quto;'); str = str.replace(/'/g, '''); /*str = str.replace(/ /g, ' ');因为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 按照白名单进行过滤(选择你要留下的东西):实现较复杂,但不容易出错

浙公网安备 33010602011771号