一、Partitioned属性
Parttitioned属性在2023年中期被引入主流浏览器。
允许开发人员选择将 cookie 放入分区存储中,每个顶级站点都有一个单独的 cookie 存储空间。
🎈通常情况下:
1. 一个用户访问 https://site-a.example,该站点嵌入了 https://3rd-party.example 的内容。https://3rd-party.example 在用户设备上设置了 cookie。
2.该用户访问 https://site-b.example,该站点同样嵌入了 https://3rd-party.example 的内容。https://3rd-party.example 的新实例仍可以访问用户在上一页时设置的 cookie。
🎈设置了Partitioned:
Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;
1.一个用户访问 https://site-a.example,该站点嵌入了 https://3rd-party.example 的内容,https://3rd-party.example 在用户设备上使用 Partitioned 设置了 cookie。意味着网站所有者选择使用 CHIPS。
2.存储 cookie 的键现在为 {("https://site-a.example"), ("3rd-party.example")}。
3.当用户访问 https://site-b.example,该站点也嵌入了 https://3rd-party.example,因为分区键不一致,所以新嵌入的实例不再能够访问前一页面设置的 cookie。
只需要在SetCookie的时候加入Partitioned即可,不需要指定任何域名,浏览器会自动识别。
即使samesite设置为None也不会在这种情况下携带Cookie
二、示例
如果在不嵌入的情况下通过导航栏访问,设置了Partitioned会是什么情况呢?
🎈未设置Partitioned的网站A:
🎈访问网站A的/set-cookie路由模拟登录:
可以看到Cookie被设置,并且Partition Key Site为空
🎈恶意站点:
模拟嵌套网站A
iframe和fetch都会携带cookie
设置Partitioned并重复上述登录步骤
可以看到Partition Key Site设置为当前导航栏站点的二级域名
🎈恶意站点:
模拟嵌套网站A
可以发现当站点A的Cookie设置了Partition Key Site,其他任何二级域名不是Partition Key Site值的网站都无法通过任何嵌套的方式套网站A并携带A的Cookie,即使SameSite是None。
该属性我认为可以防止大部分情况的CSRF攻击,但是特殊情况除外比如A站点子域名收到了攻击,利用子域名对二级域名实现CSRF攻击。所以还是得靠Samesite