same-site 如何保护用户免受 csrf 的攻击

121 阅读1分钟

假设这样一个场景:

  1. 用户 A 在网站 a.com 登录后,浏览器存储 a.com 的 cookie
  2. 用户 A 在网站 a.com 进行交易操作,携带 cookie 调用接口 a.com/api/transfer
  3. 用户 A 同时打开了 b.com,一个欺诈网站
  4. b.com 引导用户 A 点击按钮,携带了 a.com 的 cookie 调用 a.com/api/transfer
  5. 用户在 b.com 触发了 a.com 上的交易操作,用户却完全不知情。

以上,就是一个 csrf 攻击的场景。

same-site 如何在这种情景下保护用户 ?

same-site 的默认值是 lax,这种情况下,不属于 same site 的请求,就不会携带 cookie。因为 b.coma.com 不属于 same site,所以 b.com 调用接口 a.com/api/transfer,不会携带 cookie,上述场景的步骤4也就无法成立。

same-site: strict 也有同样的效果。

怎么判断两个网站是否属于 same-site ?

当两个网站的 eTLD (effective Top-level Domain) + 1 相同时,就是 same site。

WXWorkCapture_1625889774791.png

比如:

a.comapi.a.com 属于 same site,因为 eTLD + 1 都是 a.com。

a.comb.com 就不属于 same site。