CSRF 攻击 与 SameSite 属性
1. CSRF 攻击介绍
当用户登录银行网站A(例如 bank.com
)时,其浏览器会存储认证信息。恶意网站B(例如 attacker.com
)可能会包含一个自动提交的请求,模拟用户在银行网站A上的操作,如转账。如果用户被诱骗访问了这个恶意页面,银行网站A将收到带有认证信息的转账请求,从而导致用户的财产损失。
常见的处理 CSRF 攻击的方式主要有:CSRF Token(常存储于 session 中)和配置Cookies的 SameSite
属性
2. SameSite
SameSite 属性控制 Cookie 是否随跨站请求一起发送,有助于防范跨站请求伪造攻击(CSRF)。
关于 SameSite 的定义,当「URL 协议」和「域名」一致时,即为 SameSite,子域名以及端口可以不一致。
Similarly, cookies for a given host are shared across all the ports on that host, even though the usual “same-origin policy” used by web browsers isolates content retrieved via different ports. –rfc6265
URL | Description | same-site | same-origin |
---|---|---|---|
http://www.example.org |
Identical URL | ✅ | ✅ |
http://www.example.org:80 |
Identical URL (implicit port) | ✅ | ✅ |
http://www.example.org:8080 |
Different port | ✅ | ❌ |
http://sub.example.org |
Different subdomain | ✅ | ❌ |
https://www.example.org |
Different scheme | ❌ | ❌ |
http://www.example.com |
Different TLD | ❌ | ❌ |
2.1. SameSite 的三种属性
服务器返回 set-cookie
HTTP 响应标头,以设置 cookie 属性,
根据 Fetch 规范,Set-Cookie 是一个禁止修改的响应标头,浏览器会阻止前端 JavaScript 代码访问该标头。
- SameSite=Strict:在 Strict 模式下,任何第三方请求都不会发送 Cookie。即使用户点击链接导航到目标网站,请求也不会携带 Cookie。
- SameSite=Lax:在 Lax 模式下,只有在用户通过顶级导航(如点击链接或通过地址栏输入 URL)访问站点时,Cookie 才会被发送。因此,这种情况下请求会携带 Cookie。
- SameSite=None:在 None 模式下,Cookie 会在任何请求中发送,但需要设置
Secure
属性以确保安全性。
2.2. SameSite Cookie 发送情况对比表
同站跨站,对比的是顶级域名,即浏览器地址栏中的域名。
请求方 | 请求类型 | 示例 | SameSite=Strict | SameSite=Lax | SameSite=None |
---|---|---|---|---|---|
同站 | 直接在地址栏输入URL并访问 | ✅ | ✅ | ✅ | |
同站 | 通过浏览器刷新页面 | ✅ | ✅ | ✅ | |
同站 | <a> 链接 |
✅ | ✅ | ✅ | |
同站 | iframe | ✅ | ✅ | ✅ | |
同站 | AJAX/fetch请求 | ✅ | ✅ | ✅ | |
跨站 | <a> 链接 |
<a href="..."></a> |
❌ | ✅ | ✅ |
跨站 | 预加载 | <link rel="prerender"href="..."/> |
❌ | ✅ | ✅ |
跨站 | 发送表单(GET) | <form method="GET"action="..."> |
❌ | ✅ | ✅ |
跨站 | 发送表单(POST) | <form method="POST"action="..."> |
❌ | ❌ | ✅ |
跨站 | 跨站AJAX/fetch请求 | $.get("...") |
❌ | ❌ | ✅ |
跨站 | iframe | <iframe src="..."></iframe> |
❌ | ❌ | ✅ |
跨站 | 网站图片链接 | <img src="..."> |
❌ | ❌ | ✅ |
2.3. SameSite Cookie 优缺点对比表
特性 | SameSite=Strict | SameSite=Lax | SameSite=None |
---|---|---|---|
优点 | - 提供极强的CSRF攻击防护 - 几乎完全阻止CSRF攻击 |
- 提供中等强度的CSRF攻击防护 - 用户可以通过链接访问网站并保持登录状态,改善用户体验 |
- 总是发送cookie,适用于需要跨站发送cookie的情况 - 支持跨站表单提交、跨站AJAX请求、跨站iframe嵌入等 |
缺点 | - 用户点击外部链接访问网站时不会自动登录 - 一些认证机制(如OpenID Connect with response_mode=form_post)无法使用 - 不能用于跨站iframe嵌入 - 不能用于跨站AJAX请求 |
- 安全性不如SameSite=Strict - 一些认证机制(如OpenID Connect with response_mode=form_post)无法使用 - 不能用于跨站iframe嵌入 - 不能用于跨站AJAX请求 |
- 不提供任何CSRF攻击防护 - 需要设置Secure属性 - 可能存在旧浏览器兼容性问题,需特殊处理 |
3. 参考
- Understanding SameSite cookies: https://andrewlock.net/understanding-samesite-cookies/
- Set-Cookie - HTTP | MDN: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie
- Cookie 的 SameSite 属性 - 阮一峰的网络日志: https://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
- security - Are HTTP cookies port specific? - Stack Overflow: https://stackoverflow.com/questions/1612177/are-http-cookies-port-specific
- RFC 6265: HTTP State Management Mechanism: https://www.rfc-editor.org/rfc/rfc6265
- 本作品采用 署名-相同方式共享 4.0 国际(CC BY-SA 4.0 DEED) 许可
CSRF 攻击 与 SameSite 属性
https://blog.cc01cc.cn/2024/10/30/understand-csrf-attacks-samesite/