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