第三方Cookie设置了SameSite=Strict为什么还是被跨站访问了?

Air-洪滨 阅读 77

我在电商网站项目里设置了SameSite=StrictSecure属性,但今天测试发现广告联盟的第三方域名还是能读取到用户的登录Cookie,这是怎么回事?

尝试过在响应头这样配置:

Set-Cookie: sessionId=abc123; Path=/; SameSite=Strict; Secure

但第三方广告iframe里的JavaScript依然能通过document.cookie获取到值。是不是还有其他配置没考虑到?比如CSP策略或者Cookie的HttpOnly设置有没有冲突?

我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
长孙秀玲
SameSite=Strict 确实能防止大多数跨站请求的 Cookie 发送,但你这里的问题出在场景理解上。Strict 模式是阻止第三方上下文下的 Cookie 随请求发送到服务端,比如跨站 POST 请求或链接跳转时不会带上 Cookie。但它 并不能阻止第三方 iframe 内的 JavaScript 直接读取 document.cookie —— 这是前端脚本层面的操作,和 SameSite 机制无关。

真正防止 JS 读取的方法是加上 HttpOnly 属性。你现在只设了 Path、SameSite 和 Secure,漏了这个关键点。只要 Cookie 没有 HttpOnly,任何嵌入页面的脚本(包括广告联盟的 iframe 如果和主站同源)都能通过 document.cookie 拿到值。

检查一下是不是这些情况:

1. 广告 iframe 实际上是和你主站同源(比如都是一级域名下的不同子域),那本身就不是严格意义上的“第三方”,可以通过 domain 共享 cookie。
2. 没有设置 HttpOnly,导致 JS 可读。
3. 可能还存在主域共享的问题,比如 Set-Cookie 里没指定 Domain,浏览器默认允许子域继承。

正确的设置应该是:
Set-Cookie: sessionId=abc123; Path=/; Domain=.yourshop.com; SameSite=Strict; Secure; HttpOnly


注意 Domain 根据实际需要设,如果不想被子域共享就别加。更重要的是加上 HttpOnly,这样就算广告 iframe 能执行 JS,也拿不到 sessionID。

CSP 是另一层防护,可以限制 script 来源,但不能替代 HttpOnly 对 Cookie 的保护作用。这两个不冲突,建议都配。

总结:SameSite=Strict 防的是跨站请求自动带 Cookie,防不了同页面脚本读取。要防 JS 窃取,必须上 HttpOnly。
点赞 1
2026-02-13 08:01
南宫英歌
问题出在你对 SameSite=Strict 的理解上。这个属性确实会阻止跨站请求时自动附带Cookie,但它并不能阻止第三方通过其他方式(比如iframe嵌入)直接访问 document.cookie

关键是:你现在的Cookie没有设置 HttpOnly 属性,所以JavaScript才能直接读取到它。建议改成这样:

Set-Cookie: sessionId=abc123; Path=/; SameSite=Strict; Secure; HttpOnly


加上 HttpOnly 后,JavaScript就无法再通过 document.cookie 获取这个Cookie了。

另外提醒一下,虽然设置了 SameSite=Strict,但如果用户浏览器版本较旧(比如一些老旧的IE),可能不会完全遵循这个规则。如果真的需要更严格的隔离,可以结合CSP策略限制iframe加载来源。不过从你的描述来看,目前主要问题就是缺了 HttpOnly
点赞 3
2026-01-30 23:32