1、定义
- CSRF通过伪装来自受信任的用户的请求来利用受信任的网站,通过一个包含恶意请求的图像利用已验证过的用户身份实现恶意请求
2、产生条件
-
HTTP请求中未添加Token字段验证(HTTP协议无状态的)
-
已经登录并授权信任网站A,并在本地生成cookie
-
在不退出网站A的情况下访问网站B,网站B中包含了一条指向网站A的敏感操作的链接
3、漏洞危害
- 攻击者可盗用你的身份,以你的名义发送恶意请求,造成个人隐私泄露及财产安全
4、攻击过程
-
浏览并登录信任网站
-
验证通过在USER处产生的cookie
-
用户在没有登出A或本地Cookie没有过期状态下访问B网站
-
B要访问网站A,并发出Request请求
-
根据B的请求,USER带着本地Cookie没有过期的状态下访问B网站
5、CSRF加固
5.1、Token验证
- 在每个HTTP请求里附加一部分信息是一个防御CSRF攻击很好的方法,因为这样可以判断请求是否已经授权,如果请求里面没有这个验证token或者token不匹配的话,服务器应该拒绝这个请求
-
Session标识符
cookie存储方式是为了防止不同域直接互相访问cookie;一个普遍直接利用用户的session标识符来作为验证Token
(容易被猜中或发送第三方窃取)
-
独立session随机数
当用户第一次登录网站时,服务器可以产生一个随机数并将它存储在用户cookie中,对于每一个请求,服务器将token与存储cookie值匹配
(不能防主动的网络攻击,即使HTTPS攻击者可以利用它自己的CSRF Token来覆盖整个独立Session随机数)
-
依赖Session随机数
将用户的session标识符与CSRF token建立对应关系后存储在服务端
(服务端必须要维护一个很大的对应关系表)
5.2、Referer
- HTTP包头加入Referer后,服务器可以区分请求时同域发起的还是跨域发起的,所以可以判断是否来自同域来抵抗CSRF
3、自定义HTTP header
- 使用这种方法时,必须在所有请求里使用XMLHttpRequset并附件一个自定义头,并且拒绝所有没有自定义头的请求
6、附
6.1、HTTP协议无状态的这意味着程序每一次请求都需要验证,从而辨别客户端身份
6.2、Token
-
Token验证原理:
基于Token的身份验证是无状态的,我们不将用户信息存在服务器或session中
-
基于Token的身份验证的过程如下:
-
用户通过用户名和密码发送请求
-
程序验证
-
程序返回一个签名的Token给客户端
-
客户端储存token,并且每次用于每次发送请求
-
服务端验证token并返回数据
-
Token优势:
无状态、可扩展的,安全性
6.3、Cookie(Session对象的使用离不开cookie)
-
在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式
-
它是由web服务器保存在用户浏览器(客户端)上的小文本文件,它包含有关用户的信息
-
Cookie有些是临时的,也有持续的
-
存储:cookie存储在用户端(通常为浏览器),可以通过Javascript脚本服务端response头进行修改/设置/删除操作一个cookie
-
安全:用户端基本安全但会有CSRF攻击、服务端通过加密
-
cookie存在以下信息:
name:一个唯一确定的cookie名称,不区分大小写
value:存储在cookie中的字符串
domain cookie:对于哪个域有效
path:表示影响到的路径
expires:失效时间
secure:安全标志
6.4、HMAC
- 是密钥相关的哈希运算的消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息的输入生成一个摘要为输出