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 属性以确保安全性。

同站跨站,对比的是顶级域名,即浏览器地址栏中的域名。

请求方 请求类型 示例 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="...">
特性 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. 参考

  1. Understanding SameSite cookies: https://andrewlock.net/understanding-samesite-cookies/
  2. Set-Cookie - HTTP | MDN: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie
  3. Cookie 的 SameSite 属性 - 阮一峰的网络日志: https://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
  4. security - Are HTTP cookies port specific? - Stack Overflow: https://stackoverflow.com/questions/1612177/are-http-cookies-port-specific
  5. RFC 6265: HTTP State Management Mechanism: https://www.rfc-editor.org/rfc/rfc6265


CSRF 攻击 与 SameSite 属性
https://blog.cc01cc.cn/2024/10/30/understand-csrf-attacks-samesite/
作者
零一/cc01cc(zeo)
发布于
2024年10月30日
许可协议