CSRF跨站点请求伪造(Cross—Site Request Forgery)
攻击者盗用了你的身份(TOKEN或Cookie等认证),以你的名义往服务器发请求,这个请求对于服务器来说是完全合法的,但是却完成了攻击者所希望的操作,而你全然不知,例如:以你的名义发送邮件,转账之类的操作
CSRF攻击过程 :
CSRF攻击实例 :
小明使用浏览器登录银行网站后,银行后台会返回一个Cookie并存到小明电脑的浏览器中,在这个Cookie还没有过期之前,小明点击了浏览器弹出的广告,此时跳转到另外一个网站A,网站A有一段恶意代码,代码内容是: 往银行后台发送一个转账的请求(携带Cookie),这时,悲剧发生了,这个 url 请求就会得到响应,钱将从小明的账号转移到攻击者的账号,而小明当时毫不知情,等以后小明发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。
正常的CSRF攻击,攻击发送的请求默认会自动携带Cookie
Cookie字段 | 含义 |
---|---|
NAME=VALUE | 赋予 Cookie 的名称和其值(必需项) |
expires=DATE | Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止) |
path=PATH | 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录) |
domain=域名 | 作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie的服务器的域名) |
Secure | 仅在 HTTPS 安全通信时才会发送 Cookie |
HttpOnly | 加以限制, 使 Cookie 不能被 JavaScript 脚本访问 |
对于一个Http POST请求 http://xxx.minhung.me/ooooo/create-msg来说
如果满足下面几个条件:
上面3个条件必须同时满足,否则该Post请求就不能自动带上浏览器端已存在的Cookie
因为在CSRF攻击中,访问的就是设置Cookie的服务端的接口,所以访问的时候会自动携带Cookie
浏览器的同源策略,总的而言有以下三点限制:
在浏览器的同源策略下, 其他站点的js是不能读写别的站点的Cookie、Session Storage、Local Storage、Cache、Indexed DB
防御方案 :
发送请求时,需要验证码验证是否是用户本人,次方案明显严重影响了用户体验,而且还有额外的开发成本
次方案成本最低,但是并不能保证100%安全,而且很有可能会埋坑
Referer 是 HTTP 请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含 Referer 。比如我在www.google.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:
Referer=http://www.google.com
所以,将这个http请求发给服务器后,如果服务器要求必须是某个地址或者某几个地址才能访问,而你发送的referer不符合他的要求,就会拦截或者跳转到他要求的地址,然后再通过这个地址进行访问。
用户登录成功后,服务端将用户名和一些关键数据生成一个Token,将Token封装到Cookie中,然后发送给客户端,每次客户端发送请求时,先获取Cookie中的Token,再携带该Token访问服务端