web-dev-qa-db-ja.com

サファリのiframeにサードパーティのcookieを設定する回避策はありますか?

アプリケーションからサードパーティのサイト(SSO)に移動する必要があります。これは、Chrome、IE9、Firefoxでは正常に機能しますが、Safariでは機能しません。ページにiframeを非表示にしてCookieを設定し、実際のiframeに移動する回避策がありましたが、このトリックは現在機能しません。また、サードパーティのURLとしてアクションを使用して新しいウィンドウを開き、ブラウザーでCookieを設定してからiframeで同じウィンドウを開くことも試みましたが、これには、小さなウィンドウが開かれてハックのように見えるという欠点があります。サファリブラウザーのiframeでcookieを設定する回避策はありますか?

18
vrindavda

Cookieの追跡の概要

「Cookieの追跡」は、オンライン広告エコシステムの非常に重要な部分です。たくさんの使用シナリオがあります。これはリターゲティングと呼ばれる一例です。

多くのインターネットショッパーは、eコマースのウェブサイトでかなりの取引を見た直後に購入していません。彼らはまず商品を選び、ウェブサイトを離れ、数時間または数日で戻って実際の注文をします。

これらのユーザーを刺激するために、ウェブサイトはいわゆるリターゲティング技術を利用しています。基本的に、注文をせずにウェブサイトを離れたユーザーを覚えておき、関連する広告を他のウェブサイトに表示したいと考えています。通常、eコマースWebサイトは、そのような作業をAdExchange、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を持つユーザーがeコマースサイトにアクセスしたことを内部的に記憶しています

  • Sample-ad-exchange.comが(たとえば、tag.sample-ad-exchange.com/show_ad.jsを呼び出すことによって)他の場所に広告を表示するように要求されると、http要求とともにuser_id Cookieを受け取ります

  • sample-ad-exchange.comは、このユーザーが以前にeコマースサイトにアクセスしたかどうかを内部的にチェックします。もしそうなら、それは彼に非常に関連性の高い広告を表示する可能性があります

問題

ご覧のとおり、Cookieをドロップする機能は、リターゲティングスキームの実行可能な部分です。この種類のCookieは、ピクセルコードが広告主のドメイン(my-cool-store.comなど)にあり、ピクセル自体がサードパーティの広告交換ドメイン(.sample-ad-exchange .com)。デフォルトでは、ブラウザごとにサードパーティCookieに関するポリシーが異なります。

Chrome、Firefox、IE 8.0より前-常にサードパーティのCookieを受け入れる

IE 8.0以上-Webサイトが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を受け入れない

Safariは、iPadが登場して大きな人気を得るまで、業界にとって大きな問題ではありませんでした。調査によると、iPadユーザーは通常のPCの人よりもオンラインで買い物をする傾向があります。

Trick 1.0(機能しない)

実際、SafariはサードパーティのCookieを拒否しない場合があります。これは、ユーザーがサードパーティドメインに関連する何らかのアクションを実行した場合に発生します。 Google Analytics(および他のプラットフォームも)はこの機能を利用しました:彼らはその中にiframeとシミュレートされたフォームsumbitを挿入しました。ここで技術的な詳細に止まりません。最初に、このハックはGoogleに2250万ドルの費用がかかり、2番目のトリックはSafariの最新バージョンでは機能しなくなっています。

トリック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キーを探し(存在しない場合は作成します)、GETパラメータとしてuser_idをピクセルサーバーに渡します。次に、サーバーはCookieを発行する代わりにこのIDを記録します。

しかし、このコードはうまく機能していません。各ドメインには独自のローカルストレージがあります。また、トラッキングピクセルがmy-cool-store.comで起動された場合、user_idはmy-cool-store.comローカルストレージに保存されます。同じユーザーが、後でトラッキングコードを使用してother-domain.comにアクセスした場合、新しいユーザーとして扱われます。

Iframeでその古い良いトリックを修正することはうまくいきます。 imgタグの代わりに、pixel.sample-ad-exchange.com内のどこかにソース付きのiframeタグを挿入します。そして、ユーザー検出コードを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」ではないため、上記のアプローチは合法的です。

15
user3962772

非表示(または非表示ではありません)のiframeは、同じ起源のポリシーに違反するため、機能しません。

CORS-"Cross Origin Resource Sharing"を検索してみてください。これは現在、すべての主要なブラウザに実装されている標準です。

2
racraman

近年、オンラインのプライバシー分野は急速に変化しています。 SafariのクロスサイトCookieは機能しません。 Webkitのプライバシーポリシーに関連する一連の記事があります。

一般的な原則は、ユーザーが第三者の動作を認識していない限り、ユーザーデータを第三者が読み取らないようにすることです。

インテリジェント追跡防止(ITP1.0)

インテリジェント追跡防止(ITP2.

Webkitプライバシーブログ

0
h--n