前端安全 2018-09-25

( 本文长期更新 )

CSRF

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨網站指令碼(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

攻击原理

用户A登陆某一网站(例如豆瓣),登陆成功后该用户浏览器客户端存留Cookie记录.
该网站有条删除用户日记的接口地址:http://www.douban.com/del/article/1
攻击者利用各种手段(微信发短网址链接等等)引诱用户A进入恶意网址。 恶意网址的Html内容如下:

1
<img src="http:www.douban.com/del/article/1"/>

用户A在毫不知情的情况下请求了http:www.douban.com/del/article/1这个接口,由于他不久前登陆过豆瓣,客户端存留登陆成功的Cookie,就这样莫名的删除了自己的一篇日记,CSRF利用的就是这点,浏览器只能识别是否是该用户访问,却不能识别是否是该用户 本人意愿访问。

应对策略

后端处理 (Referer)

客户端向服务器发送请求时,Http请求头内存在一个Referer属性,属性值就是发起该次请求的域名。后端在代码里关键操作部分进行判断,如果Referer的值等于已知的域名(自家域名)则放行继续操作,否则打回。 这种办法有局限性,因为不同浏览器对Referer这个实现可能会有差异,也不排除有攻击者直接攻击浏览器篡改Referer的可能。

前后端配合处理(Token)

后端在用户登陆成功时分配给该用户一个随机生成的Token值,存在session内,同时把这个Token值返回给前端,前端可以把这个值存到cookie内或者其他本地存储,每次向服务器发起请求时把Token值作为参数一起传给后端,后端判断传过来的token是否和session中的token一致,一致则放行,否则打回。由于CSRF攻击者只能伪造用户的Cookie来骗过浏览器,但是他并不能得到Cookie中的具体值(例如Token值),所以这样的恶意请求会被后端打回,有效的防止了CSRF攻击。

XSS

跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。

XSS 分类

  1. 存储型
  2. 反射型
  3. DOM型

攻击原理

存储型的XSS一般是指恶意代码注入后保存在后端数据库内,浏览器渲染时如果没有进行过滤和转义,则会执行其中的恶意代码,例如某个网站的用户个性签名,如果某个用户在个性签名内填入

1
<script>alert(document.cookie)</script>

如果后端或者前端没有对此数据进行过滤转义处理,则会出现每个人访问该用户主页都会弹出他们浏览器的cookie,如果把这段代码换成将cookie值发送到攻击者的第三方服务器上,攻击者就可以轻易获得用户的敏感信息。

反射型的XSS一般是指服务端返回恶意脚本,在客户端触发执行的攻击

1
http://xxx.com/index.php?s=<script>alert(document.cookie)</script>

服务器上并没有这样的内容,攻击者构造恶意URL,欺骗用户点击,触发XSS攻击。

DOM型的XSS一般是指代码部分本身有漏洞存在,例如在开发者在JS部分使用了location来调用URL上的数据处理部分逻辑,引发了反射型的URL恶意构造的隐患。

应对策略

XSS 主要是指恶意注入代码,所以不要相信任何用户的输入,确保用户输入的安全性,对输入输出数据进行转义编码过滤。

其他安全措施

  1. 页面使用Https
  2. 如果不能保证参数的可控性,慎用eval();
  3. 部分cookie可以设置httpOnly
  4. Html5 iframe标签的安全新特性,sandbox属性