chrome 51开始,浏览器的cookie新增了一个SameSite属性,用来防止CSRF的攻击
什么是CSRF攻击?
CSRF(cross-site request forgery) 中文:跨站请求伪造,CSRF攻击简单理解:攻击者盗用了你的身份,以你的名义发送恶意请求。具体原理:
SameSite属性
cookie的samesite属性用来限制第三方cookie,从而减少安全风险。 对应可以设置三个值
- Strict
- Lax
- None
1、Strict
Strict最为严格,完全禁用第三方cookie,只有访问页和请求url同源(协议、域名端口号一致才属于同源),才会带上Cookie
2、Lax
Lax规则稍稍放宽,大部分时间不会设置cookie,但是get请求除外
| 请求类型 | 示例 | 正常情况 | Lax |
|---|---|---|---|
| 链接 | <a href='...'></a> | 发送cookie | 发送cookie |
| 预加载 | <link rel="prerender" href='...'></link> | 发送cookie | 发送cookie |
| get表单 | <form method='GET'></form> | 发送cookie | 发送cookie |
| post表单 | <form method='POST'></form> | 发送cookie | 不发送 |
| iframe | <iframe src='...'></iframe> | 发送cookie | 不发送 |
| ajax | axios.get('....') | 发送cookie | 不发送 |
| image | <img src='...'></img> | 发送cookie | 不发送 |
chrome目前94+版本已经把默认值设置成Lax
None
设置none值必须同时设置Secure,否则无效
Set-Cookie:token=xxxx;SameSite=None;Secure
tips
在chrome某个版本可以直接禁用掉SameSite属性,但是94+版本后禁用无效,如果目前你的cookie设置不进去可以在代码里面将SameSite设置成None(如果你的cookie是服务端设置的,那么就要服务端修改一下咯,我们这边很鸡肋,叫服务端那边修改一下,叫了无数次都不肯配合来改,心累,后面经过不知道怎么的沟通,妥协了)具体请看上面none值设置,获取禁用掉chrome的SameSite ,具体设置可以步骤:
1.谷歌浏览器打开chrome://flags/
2.搜索samesite
3.SameSite by default cookies项设置为Disabled即可
(ps:欢迎各位猿友来吐槽)