CSRF

CSRF算是比较简单的Web攻击方式了吧,我们来看看它到底是什么。



CSRF简介

CSRF(Cross-site request forgery)学名叫跨站请求伪造。从名字上可看出来,跨站,至少涉及两个站点。
CSRF的流程是这样的:

  1. 用户登录正常网站A
  2. 用户的登陆凭证被保存在了本地cookie中
  3. 用户未登出的情况下,同时又浏览了网站B(恶意网站)
  4. B站私自访问了A站的某些操作(比如删除信息等)
  5. A站检查到用户的登陆凭证,认为用户合法(删除信息这个操作就执行了)

攻击原理

浏览器访问某站时,会携带该站保存在本地的cookie去请求该站的服务器。
比如访问A站,就会携带A的cookie去请求A站的服务器。访问A站时,不会携带另一个站点的cookie信息。
而CSRF攻击就是利用了这点,访问B站时,B站在用户不知情的情况下悄悄访问了A,这时就携带了A站的cookie,
A站检查cookie中的登陆凭证,认为正确,结果恶意操作就被当成正确操作执行了。

举个例子:
www.A.com站在用户登录后,会将登陆凭证保存在本地cookie中,A站有个删除个人信息的操作www.A.com/user/, 但需要一个参数:type(type=delete表示删除个人信息,type=modify表示修改个人信息等)。
用户登录A站之后又访问了B站(恶意网站),B站中有这样一段代码:

<form action=www.A.com/user/ method=POST>
    <input type="text" name="type" value="delete" />
</form>
<script> document.forms[0].submit(); </script>

用户访问了B结果B站悄悄向A提交了删除信息的操作(访问A会携带A的cookie),这样就是CSRF攻击了。


防范方法

防范的方法有许多,Token方式是最主流的。

Token

CSRF能攻击成功,根本原因是:操作所带的参数均被攻击者猜测到了。
根据这个原因,我们就可以添加一个Token参数,其值是随机的,使攻击者不知道无法猜到。
通过Token方式防范CSRF,实施起来可以有两种方式吧,一是通过session,二是通过cookie。

  • 通过session的方式

服务端生成token,并保存在session中,然后拍给前端,放到hiddin域里。 下次请求时就会把token提交到服务端,服务端从session中取出token和hiddin域提交过来的token对比。

  • 通过cookie的方式

服务端生成token,拍给前端放到hiddin域里,然后经过加密把密文放在cookie里。 下次请求时会把hiddin域中的token和cookie里的加密token都提交给服务器,服务器得到cookie里的加密token进行解密, 然后跟hiddin域提交过来的token进行对比。

验证码

验证码不仅可用来防止暴力破解,还可以有效防止CSRF的攻击。 但问题在于,不可能在用户的所有操作上都需要输入验证码。只有一些关键的操作,才能要求输入验证码。

Referer字段检查

当浏览器向web服务器发出请求的时候,在HTTP的请求头(Request Headers)中一般会带上Referer,告诉服务器用户从哪个站点链接过来的。 服务器通过判断请求头中的referer,也能避免CSRF的攻击。