乐闻世界logo
搜索文章和话题

SameSite Cookie 属性如何防护 CSRF 攻击,有哪些使用场景?

2月19日 19:19

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 防护
  • 仅在特定场景下使用(如第三方登录)

实现方式

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+

最佳实践

  1. 默认使用 Lax 模式

    • 提供良好的 CSRF 防护
    • 保持正常的用户体验
    • 适用于大多数应用场景
  2. 敏感操作使用 Strict 模式

    • 涉及资金交易、权限变更等敏感操作
    • 可以在特定路由或页面设置更严格的策略
  3. 配合其他防护措施

    • CSRF Token
    • Referer 头验证
    • 自定义 HTTP 头
  4. 渐进增强策略

    • 检测浏览器是否支持 SameSite
    • 不支持时回退到其他防护机制

注意事项

  1. Secure 属性要求

    • SameSite=None 必须配合 Secure 属性
    • 需要使用 HTTPS 协议
  2. 子域名行为

    • SameSite 将子域名视为同站
    • a.example.com 和 b.example.com 是同站关系
  3. 测试验证

    • 在不同浏览器中测试行为
    • 验证跨站请求的正确处理

SameSite Cookie 属性是防护 CSRF 攻击的重要工具,但应该作为多层防护策略的一部分,而不是唯一的防护措施。

标签:CSRF