假设我有一个位于www.example.com的站点,它有一个指向 ASP.NET 站点myapp.othersite.com的 IFRAME - 这会导致会话和第 3 方 cookie 出现问题,据我所知。
如果我将嵌入式应用程序移至myapp.example.com,会话 cookie 是否仍算作第 3 方 cookie,因为它是不同的子域?
example.com
如果 Cookie 来自不同的基域(基域为或),它们似乎被视为第 3 方example.co.uk
,但如果它们来自同一基域的不同子域,则不是。
myapp.example.com
如果它嵌入在.myapp.example.com
www.example.com
除非需要从不同的子域读取这些 cookie,否则不需要myapp.example.com
使用域设置 cookie 。.example.com
[在 Firefox、Chrome(阻止 3rd 方 cookie)和 Safari 中测试] [ ThirdPartyUtil.IsThirdPartyInternal似乎是在 Firefox 中检查的地方]
如果您在域上设置 Cookie.example.com
那么来自www.example.com和www.myapp.example.com的 cookie将被视为相同。
没有 cookie 被视为第 3 方 cookie。
假设没有在相关 cookie 上设置域属性,在这种情况下,由于主机名不同,它确实是第三方 cookie。但是,通常会阻止第三方 cookie 的浏览器不会阻止它,因为基本域相同。因此,在这方面,它不被视为第三方 cookie。
我知道这一点是因为当基域相同而子域不同时,我能够成功设置和读取第三方 cookie,而第三方 cookie 在最新版本的 Firefox、Chrome 和 Microsoft Edge 浏览器设置中被阻止。即使没有在 cookie 上设置域属性也是如此。这意味着 Firefox、Chrome 和 Microsoft Edge 不会将来自同一基本域的 cookie 视为第三方 cookie。
我的方法如下。我有两个不同的主机名,它们具有相同的基本域但不同的子域。其中之一包含两个 PHP 文件。第一个设置一个带有随机 cookie 名称且没有域属性的 cookie,并将 cookie 的名称作为 JSONP 返回。第二次尝试读取 cookie,然后返回 true 或 false 作为 JSONP。另一个主机名包含一个 HTML 文件,该文件使用 AJAX 查询设置 cookie 的第一个 PHP 文件,然后在完成后立即再次使用 AJAX 查询第二个 PHP 文件,该文件测试是否存在 cookie。在继续之前,我首先确保浏览器阻止了第三方 cookie。我测试了三种浏览器:Firefox、Chrome 和 Microsoft Edge。
结论:如果一个资源设置了cookie,并且该资源上的基域与网站上的基域相同,但子域不同,则流行的浏览器不会将其视为第三方cookie。