30

我需要从我的应用程序导航到第三方站点 (SSO),这在 chrome、IE9 和 Firefox 中运行良好,但在 safari 中运行良好。有一种解决方法是在页面上隐藏 iframe 以设置 cookie,然后导航到实际的 iframe,但这个技巧现在不再有效。我还尝试打开一个带有第三方 URL 操作的新窗口,以在浏览器中设置 cookie,然后在 iframe 中打开它,但这有一个缺点,即打开的那个小窗口看起来像一些 hack。是否有任何解决方法可以在 iframe 中为 Safari 浏览器设置 cookie?

4

3 回答 3

23

跟踪 cookie 简介

“跟踪 cookie”是在线广告生态系统中非常重要的一部分。有很多使用场景。这是一个称为重定向的示例。

众所周知,很多网购者在电子商务网站上看到优惠后不会立即购买。他们看一看,离开网站并在几个小时或几天后返回以进行实际订购。

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

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

  • 网站所有者有一小段 HTML 代码,称为“跟踪像素”。让我们考虑一个简单的情况,即跟踪像素是透明的 GIF 图像:

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

  • http://pixel.sample-ad-exchange.com/pixel.gif删除名为 user_id 的域 '.sample-ad-exchange.com' 的 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 有不同的政策:

  • 8.0 之前的 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 OUR BUS COM INT OTC PUR STA"'

  • Safari从不接受第三方 cookie

在 iPad 出现并大受欢迎之前,Safari 对行业来说并不是一个大问题。研究表明,iPad 用户比一般的 PC 用户更倾向于在线购物。

Trick 1.0(不再工作)

事实上,Safari 有时不会拒绝第三方 cookie。它发生比用户做了一些与第三方域相关的操作。谷歌分析(和其他平台)也利用了这个功能:他们在其中插入了一个 iframe 和模拟表单 sumbit。我不会在这里停留在技术细节上。首先,这个 hack 让谷歌损失了 2250 万美元,其次这个技巧在 Safari 的最新版本中不再起作用

技巧 2.0 (HTML5 本地存储)

这个技巧的想法是使用 HTML5 localStorage API。这个 API 与 cookie 非常相似——它允许通过 javascript 管理用户的偏好并将其本地存储在用户的盒子上。为什么不将用户 ID 存储在 localStorage 中?我想出的第一个版本的代码:

  <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 在“内部”执行,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>

法律问题

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

于 2014-08-21T08:47:37.097 回答
1

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

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

于 2014-08-18T13:26:14.863 回答
0

近年来,在线隐私领域正在迅速变化。Safari 中的跨站点 cookie 将不起作用。有一系列与 webkit 的隐私策略相关的文章。

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

智能防跟踪(ITP1.0)

智能防跟踪(ITP2.0

Webkit 隐私博客

于 2019-09-02T06:37:57.247 回答