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

vri*_*vda 18 safari iframe

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

小智 16

跟踪cookie简介

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

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

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

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

  • 网站所有者提供了一小段HTML代码.这段代码称为"跟踪像素".让我们考虑一个跟踪像素是透明GIF图像的简单情况:

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

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

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

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

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

问题

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

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

IE 8.0及以上版本 - 仅在网站明确声明如何使用cookie时才接受第三方cookie.声明通过P3P协议完成.正如W3C的每一个规格一样,这个也非常神秘.但实质上是名为"P3P"的HTTP标头,您需要与包含cookie的http响应一起发送.这个标题内容工作得很好,虽然我不知道究竟是什么声明:'P3P:CP ="NOI DSP COR NID CURA ADMa DEVa PSAa PSDa我们的公共汽车COM INT OTC PUR STA"'

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);
}
Run Code Online (Sandbox Code Playgroud)

这个想法很简单:在本地存储中查找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执行"inside"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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

法律问题

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

  • localStorage + iFrame不再适用于Safari.Safari似乎将IFrame中的localStorage分区为主页面域和IFrame域的组合.因此,在Safari中:在带有带src站点Y的IFrame的站点X上,您将在IFrame中写入localStorage.localStorage值仅在站点X上的IFrame中可用.如果您转到站点Z并且具有到站点Y的IFrame,则站点X上设置的值将不可用.请参阅[JSMentors列表]的讨论(http://groups.google.com/forum/#!topic/jsmentors/Jby_5Tt47SI) (9认同)

rac*_*man 1

隐藏(或未隐藏!) iframe 将不起作用,因为它们仍然会违反同源策略。

尝试搜索 CORS - “跨源资源共享”。该标准现已在所有主要浏览器中实施。