是否有任何解决方法在iframe中为Safari设置第三方cookie?

时间:2013-09-17 14:34:57

标签: iframe safari

我需要从我的应用程序导航到第三方站点(SSO),这适用于chrome,IE9和Firefox,但不适用于Safari。有一个解决方法是在页面上隐藏iframe来设置cookie,然后导航到实际的iframe,但这个技巧现在不再有用了。我还尝试打开一个新窗口,将操作作为第三方URL在浏览器中设置cookie然后在iframe中打开它,但这样做的缺点是打开的小窗口看起来像一些黑客。是否有任何解决方法在Safari中为Safari设置cookie?

3 个答案:

答案 0 :(得分:14)

跟踪Cookie简介

“跟踪Cookie”是在线广告生态系统中非常重要的一部分。他们有大量的使用场景。这是一个叫做重定向的例子。

众所周知,许多互联网购物者在看到电子商务网站上的优惠后,并没有立即购物。他们首先选择一个好的,离开的网站,并在几个小时或几天内返回以进行实际订购。

为刺激这些用户,网站利用所谓的重定向技术。基本上,他们想要记住在没有下订单的情况下离开他们网站并在其他网站上向他们展示相关广告的用户。通常,电子商务网站将此类工作委托给在线广告平台,如AdExchanges,DSP等。

从技术角度来看,它的工作原理如下:

  • 网站所有者会输入一小段HTML代码。这段代码被称为"跟踪像素"。当跟踪像素是透明GIF图像时,让我们考虑一个简单的情况:

    ... <img src="http://pixel.sample-ad-exchange.com/pixel.gif"> ..

  • http://pixel.sample-ad-exchange.com/pixel.gif删除了域名&#39; .sample-ad-exchange.com&#39;名称为user_id。在此cookie中存储生成的唯一用户ID(如果cookie已存在,服务器只是跳过此部分)

  • sample-ad-exchange.com在内部记得具有此ID的用户访问过电子商务网站

  • 当请求sample-ad-exchange.com在其他地方展示广告时(例如,通过调用tag.sample-ad-exchange.com/show_ad.js),它会收到user_id cookie以及http请求< / p>

  • sample-ad-exchange.com在内部检查该用户之前是否访问过任何电子商务网站。如果他有,可以向他展示一个非常相关的广告

问题

正如您所看到的,丢弃cookie的能力是重定向方案的可行部分。这种cookie被称为&#34;第三方cookie&#34;因为像素代码位于广告客户域(例如my-cool-store.com),而像素本身位于第三方广告交换域(.sample-ad-exchange.com)上。默认情况下,不同的浏览器对第三方cookie有不同的策略。

Chrome之前的Chrome,Firefox,IE - 始终接受第三方Cookie

IE 8.0及以上版本 - 仅在网站明确声明如何使用Cookie时才接受第三方Cookie。声明通过P3P协议完成。正如W3C的每一个规格一样,这个也非常神秘。但实质是HTTP标头名为&#34; P3P&#34;您需要与包含cookie的http响应一起发送。这个标题内容很好但我不知道它的确切含义是什么:&#39; P3P:CP =&#34; NOI DSP COR NID CURA ADMa DEVa PSAa PSDa我们的总线COM INT OTC PUR STA&#34;&#39;

Safari - 永远不接受第三方Cookie

在iPad出现之前,Safari对于行业来说并不是一个巨大的问题,并且获得了巨大的声望。研究表明,iPad用户倾向于在线购物,而不是普通的PC用户。

诀窍1.0(不再工作)

事实上,Safari有时并不拒绝第三方cookie。它发生的比用户做了一些与3rdparty域相关的动作。 Google Analytics(以及其他平台)也利用了此功能:他们在其中插入了iframe和模拟形式的sumbit。我不会在这里停止技术细节。首先,这个黑客花费了2250万美元,其次是在最新版本的Safari中不再使用的技巧

Trick 2.0(HTML5 localStorage)

这个技巧的想法是使用HTML5 localStorage API。此API与cookie非常相似 - 它允许从javascript管理用户的首选项并将其本地存储在用户的框中。为什么不在localStorage中存储用户ID?我提出的第一个代码版本:

  <script type="text/javascript">
if (typeof navigator != "undefined" && typeof navigator.vendor != "undefined" &&                               navigator.vendor.indexOf("Apple") >= 0 && typeof localStorage != "undefined") {
    //Check if browser is made by Apple (means it's Safari) and local storage is available
    var userId = localStorage.getItem("user_id");
    if (userId == null) {
        //set user is if user is unknown
        userId = Math.random();
        localStorage.setItem("user_id", userId);
    }
    var img = document.createElement('img');
    img.src = "http://pixel.sample-ad-exchange.com/pixel.gif?user_id=" + user_id;
    var body = document.getElementsByTagName('body')[0];
    body.appendChild(img);
}

这个想法非常简单:在本地存储中查找user_id键(如果它不存在则创建一个),并将user_id作为GET参数传递给像素服务器。然后服务器将记录此ID而不是激活cookie。

但是这段代码运作良好。每个域都有自己的本地存储。如果您在my-cool-store.com上触发跟踪像素,则user_id将存储在my-cool-store.com本地存储中。如果同一个用户稍后会使用跟踪代码访问other-domain.com,则会将其视为新的。

用iframe解决那个旧的好技巧会起作用。我们将在pixel.sample-ad-exchange.com内的某处插入iframe标签,而不是img标签。并将用户检测代码放在iframe中。 iframe执行&#34;内部&#34; pixel.sample-ad-exchange.com本地存储对于所有被跟踪的站点都是相同的。这是一个完整的例子:

跟踪代码:

<script type="text/javascript">
if (typeof navigator != "undefined" && typeof navigator.vendor != "undefined" &&       `navigator.vendor.indexOf("Apple") >= 0 && typeof localStorage != "undefined") {`
    var iframe = document.createElement('iframe');
    img.src = "http://pixel.sample-ad-exchange.com/iframe.html";
    var body = document.getElementsByTagName('body')[0];
    body.appendChild(img);
}
</script>

iframe代码(http://pixel.sample-ad-exchange.com/iframe.html

<html>
<head></head>
  <body>
  <script type="text/javascript">
var userId = localStorage.getItem("user_id");
if (userId == null) {
    //set user is if user is unknown
    userId = Math.random();
    localStorage.setItem("user_id", userId);
}
var img = document.createElement('img');
img.src = "http://pixel.sample-ad-exchange.com/pixel.gif?user_id=" + user_id;
var body = document.getElementsByTagName('body')[0];
body.appendChild(img);
</script>
</body>
</html>

法律问题

有趣的问题是这种方法是否合法。如果下一家公司使用它将获得2250万美元罚款。我不是律师,但从我的常识角度来看,Safari设置明确表示&#34;阻止来自第三方和广告商的第三方cookie&#34;而localStorage不是一个&#34; cookie&#34;上述方法似乎是合法的。

答案 1 :(得分:2)

隐藏(或不隐藏!)iframe无效,因为它们仍会违反同源策略。

尝试搜索CORS - “跨源资源共享”。它是现在在所有主流浏览器中实现的标准。

答案 2 :(得分:0)

近年来,在线隐私领域正在快速变化。 Safari中的跨站点Cookie无效。有一系列与Webkit隐私策略有关的文章。

一般原则是,除非用户知道第三方的行为,否则第三方不应读取用户数据。

Intelligent Tracking Prevention(ITP1.0)

Intelligent Tracking Prevention(ITP2.0

Webkit privacy blogs