js-samesite兼容性及csrf处理

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
2
3
4
5

<form action="http://admind187.debug.klk.io/xos_api/prosrv/campaign/link/delete" method="POST">
<input name="project_id" id="project_id" val="0" />
<button>Post</button>
</form>

版本兼容性

测试

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 处理
  • 前端设置浏览器版本控制, 阻止用户使用较低版本浏览器访问