CSRF 主要设计两种 http 操作
- safe http methods: "GET", "HEAD", "OPTIONS", and "TRACE",
- unsafe http methods: "POST"
这里 klk 技术团队已经遵循了基本的安全概念,即不会使用 GET 操作进行数据库的操作或业务逻辑处理,所以这里主要讨论 POST 情况, 讨论使用 Cookie 的 SameSite 属性来保证 POST 请求的安全性是否可行
第一种: post JSON
结论 :post JSON 会直接触发浏览器 CORS 安全防护。 但是在 使用 IP 而非域名的情况下不会触发(这里对用户无影响。 可视为使用 CURL)
第二种:post Form
代码
这里利用了一个现有的 post form 接口
1 |
|
版本兼容性
测试
firefox v49 (无 SameSite 支持)
点击 Post.
表单提交成功并且目标域名 Cookie 信息
结论 : 有漏洞存在
firefox v61 ( 支持 SameSite, 但是不会默认设置为 SameSite=Lax )
重复以上操作
可以看到有 sameSite 支持 但是默认为 Unset
发送请求有 Cookie 携带。
结论: 存在漏洞
Chrome V81+ ( 支持 SameSite 并且 默认 SameSite=Lax )
重复以上操作
可见支持 SameSite (默认 SameSite 值未给出 )
可见 该请求未携带任何 Cookie 信息
结论: 目前部分较新版本浏览器默认支持 SameSite=Lax, 该情况下无 CSRF 漏洞问题。这里有结果返回主要因为是接口较旧没有做鉴权认证
总结论
官方文档解释
这里参考 https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-02#section-5.3.7.1
Lax enforcement provides reasonable defense in depth against CSRF attacks that rely on unsafe HTTP methods (like "POST"), but does not offer a robust defense against CSRF as a general category of attack
官方解释为“ 使用 SameSite=Lax 可以对 unsafe HTTP Methods 有比较好的防护, 但是不能防护所有 CSRF 类 攻击。 ”
这里针对 B 端的常见业务以及已存在的技术团队内部的技术时间,我们只要针对 Post 请求进行 CSRF 防范即可。 这里使用 SameSite=Lax 已经可以满足需求
待处理
在笔者整理文档时还是有几大浏览器没有使用默认 SameSite=Lax 的处理 。 并且 IE 根本没有 SameSite 支持。 基于此:
- 后端鉴权服务主动添加 SameSite=Lax 处理
- 前端设置浏览器版本控制, 阻止用户使用较低版本浏览器访问