也来谈谈CSRF

Posted by Leemon on July 14, 2016

2016/7/18 11:07:00

定义

百度百科对于CSRF的定义:

CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

原理

CSRF的中文名称是跨站请求伪造,CSRF攻击的主要原理为获取用户的cookie,伪造用户身份进行恶意请求。

此类攻击需满足两个条件

  • 用户登陆受信任的网站或页面,如a.com;
  • 在用户不登出受信任网站或页面的情况下,点击打开攻击者伪造的包含恶意代码的b.com;

防护

  1. 验证码
    • 此方法是防御CSRF攻击最简单有效的方法,但是如果每个提交操作均使用验证码,虽然安全性高了,但是造成用户体验差。 所以只在特殊关键请求的使用验证码,比如注册、登陆、初次修改、查询个人隐私信息。
  2. Token(非一次性)
    • 第一次接触CSRF是在学习django的时候,在django的配置文件里有一个选项为django.middleware.csrf.CsrfViewMiddleware,然后在任何模板需要使用post请求的地主插入{% crsf_token %}这样在每个模板生成的页面上就有一个在post form里面的隐藏的csrf_token域,在form提交时,会隐式提交cookie中的csrftoken用于服务器端验证。
    • 此处的csrftoken就不是一次性的,默认的有效期为31449600秒(52周)。这样的做的弊端就是一段时间内所有请求的csrftoken值均是相同的,无法有效防范CSRF攻击
  3. One-Time Token
    • 一次性token,每次提交都是随机的token值.
    • token的使用原则(摘自乌云)

      • Token要足够随机—只有这样才不可预测.
      • Token要注意保密性—敏感操作使用post,防止Token出现的URL中.