跨站脚本攻击(Cross-site scripting),简称XSS,是一种针对网页客户端的攻击手段。攻击者利用网站前后端代码的漏洞,将他自己的恶意代码嵌入页面中,然后诱导他人点击。一般这种攻击最容易造成的影响就是用户信息被盗,恶意代码可以将被害者的cookies信息以各种形式发给攻击者,这样子攻击者就能够伪装成被害者做任何事情。下图是腾讯公司近几年的漏洞占比,XSS占比高达25%,这问题非常常见,我们也要重点处理。
2、 跨站脚本攻击的方式
以我们一个线上素材代码为例:
可以看到,JS做的事情是,把URL中的几个参数取出,拼接在html中显示。
这里有个非常大的安全隐患。我构造了一个如下URL,并发给别人时:
./index.html?cover="/><script>alert(0)</script>
别人的手机其实就在执行我的攻击代码了,具体可见邮件中的代码包。
这只是其中一种攻击方式,还有常见的攻击方式是在评论中写入攻击代码,前端显示这条评论的时候,所有用户都会受到攻击,这种漏洞更为严重。
3、 如何防范
一句话,永远不相信用户数据。
所有用户可以修改的数据,包括评论发言、用户昵称、URL参数,都是危险的,都不可以直接放在页面上显示。
如果实在需要显示,一定要经过过滤,把恶意代码进行清理后再展示。
过滤步骤:
1、 引入XSS过滤的JS库xss.js
2、 对不安全的输入进行过滤,建议在显示的时候进行过滤
3、 如果是元素本身并不需要html的话,可以直接使用Zepto内置的text方法。text方法修改的是元素textContent属性,仅作为文本显示,而不像html方法修改innerHtml容易造成XSS。
4、这里仅仅举例了从URL获取参数拼在html中的情况,同样的,从服务器拉取评论填入html等类型的操作,也要进行这样的处理