SameSite Cookie 属性是现代浏览器提供的一种有效防护 CSRF 攻击的机制,它通过控制 Cookie 在跨站请求中的发送行为来增强安全性。
SameSite 属性的三种值
1. Strict(严格模式)
- Cookie 只在同站请求中发送
- 跨站请求不会携带 Cookie
- 提供最强的 CSRF 防护
- 可能影响用户体验(如从外部链接点击进入网站时不会携带 Cookie)
2. Lax(宽松模式,推荐)
- 允许某些安全的跨站请求携带 Cookie
- 允许的情况:
- GET 请求
- 顶级导航(如点击链接)
- 预加载请求
- 不允许的情况:
- POST、PUT、DELETE 等修改性请求
- iframe、image、script 等资源请求
- 平衡了安全性和用户体验
3. None(不限制)
- 允许所有跨站请求携带 Cookie
- 必须配合 Secure 属性使用
- 不提供 CSRF 防护
- 仅在特定场景下使用(如第三方登录)
实现方式
设置 SameSite Cookie
javascript// Node.js Express 示例 res.cookie('sessionId', 'abc123', { httpOnly: true, secure: true, sameSite: 'lax' // 或 'strict', 'none' }); // PHP 示例 setcookie('sessionId', 'abc123', [ 'httponly' => true, 'secure' => true, 'samesite' => 'Lax' ]);
SameSite 属性的兼容性
- 现代浏览器:Chrome 51+、Firefox 60+、Safari 12+、Edge 79+
- 旧版浏览器:不支持 SameSite 属性,需要其他防护措施
- 移动浏览器:iOS Safari 12.2+、Android Chrome 51+
最佳实践
-
默认使用 Lax 模式:
- 提供良好的 CSRF 防护
- 保持正常的用户体验
- 适用于大多数应用场景
-
敏感操作使用 Strict 模式:
- 涉及资金交易、权限变更等敏感操作
- 可以在特定路由或页面设置更严格的策略
-
配合其他防护措施:
- CSRF Token
- Referer 头验证
- 自定义 HTTP 头
-
渐进增强策略:
- 检测浏览器是否支持 SameSite
- 不支持时回退到其他防护机制
注意事项
-
Secure 属性要求:
- SameSite=None 必须配合 Secure 属性
- 需要使用 HTTPS 协议
-
子域名行为:
- SameSite 将子域名视为同站
- a.example.com 和 b.example.com 是同站关系
-
测试验证:
- 在不同浏览器中测试行为
- 验证跨站请求的正确处理
SameSite Cookie 属性是防护 CSRF 攻击的重要工具,但应该作为多层防护策略的一部分,而不是唯一的防护措施。