web-dev-qa-db-ja.com

サードパーティのCookieをブロックする-回避策(Facebookアプリなど)

MacのSafariにはBlock cookies に設定 From third parties and advertisersデフォルトで。

埋め込まれたswfが別のドメインからのものである場合、SharedObjectが機能しなくなります。

この問題は新しいものではありません: SafariサードパーティのCookie iframeトリックが機能しなくなりましたか?

誰かが解決策を見つけましたか(それ以外の場合は、各リクエストのGET/POSTパラメータを介してセッションIDを渡します)?

注:swfを埋め込んでいるサイトにアクセスできないため、そのHTMLを変更したりJavaScriptを配置したりする方法はありません。

18
sanchez
function setCookie(){
   if ( navigator.userAgent.indexOf('Safari') != -1 &&
        navigator.userAgent.indexOf('Chrome') == -1 ){
      window.open('safari.php','','width=200,height=100' );
   }
}

// then we set the cookie in safari.php

出典: http://www.reizbombardement.de/archives/safari-5-1-4-enforces-cookie-policy

// 2013年7月23日更新

この問題を修正するこのくだらない方法は、Safari6まで機能していました。

以下の@FabioAntunesと@ncubicaのコメントをご覧ください。

// 2013年7月23日更新FabioAntunes

これが私のコードです

ランディングページには、アプリの簡単な説明と「Enter」のようなボタンがあります。 jqueryを使用してこのプロセスを簡略化し、クリックイベントのリスナーを作成します。ランディングページの残りのhtmlコードが既にあると想定しているため、JavaScriptコードを配置します。

$(document).on("click", "#bt-landing", function(){
var left = (screen.width/2)-(500/2);
            var top = (screen.height/2)-(250/2);
            window.open('URL_FOR_THE_PHP_THAT_WILL_CREATE_THE_SESSION', '_blank', 'width=500,height=250,toolbar=0,location=0,menubar=0, top='+top+', left='+left);
});

これにより、画面の中央に500 x 250pxの小さなウィンドウが開きます。

私が小さなウィンドウ用に持っているコードはこれです:

<?php setcookie("safari_cookie", "1");?>
    <html>
        <head>
            <meta charset="utf-8">
            <title>THE NAME OF YOUR APP OR SOMETHING THAT THE USER WE'LL READ AND ASSUME THAT THIS SMALL WINDOW IS RELIABLE</title>
        </head>
        <body>
        <script type="text/javascript">
        $(document).ready(function(){
           setTimeout(function(){window.close()},1000);
        })
        </script>
        </body>
    </html
12
sanchez

Safari トップウィンドウでアクセスしていないドメインからのCookieは引き続きブロックされます

これを回避するために、PHPで($ _COOKIES)をカウントし、ブラウザを元の場所に戻すだけの仕事をしているドメイン上のページにブラウザを誘導します。これは汚いです。トリックとは、一部のユーザーが不必要に離れてから戻ってしまうことを意味しますが、その後、Webは汚いトリックでいっぱいになります。

Cookieを設定する必要のあるドメインのページにtop.location.hrefを設定できない場合、またはそのドメインのページを変更できない場合は、URLベースのセッションを使用する必要があると自信を持って言えます。

ただし、別のオプション(ドメインでページを作成できる必要があります)は、ユーザーがSWFをクリックするように要求することです。その後、window.openをトリガーして、作成したページをURLで指すようにすることができます。正常にロードするだけで、ユーザー(またはポップアップページ自体のJS)がポップアップを閉じることができます。その後、Cookieを設定できます。


私はこの問題を抱えているiframe内にあるFacebookアプリを開発しています。この修正プログラムを使用して、すべてのアプリを出荷する必要があります。

10
rcambrj

ごく最近の経験から、これはMac上のSafariの問題ではなく、問題として経験したこともないと言えます。

設定がサードパーティからのCookieをブロックしているとおっしゃいました。SharedObjectストレージはサードパーティからのものではなく、アクセスしているサイト(ファーストパーティ?)からのものです。ですから、それが問題になることはないと思います。

Flash Player設定パネルを使用して、ユーザーはSharedObjectを無効にする(またはストレージスペースの量を制限する)ことができます。したがって、一般的に、アプリはSharedObjectが利用できない場合を処理する必要があります。

ただし、ほとんどのユーザーはSharedObjectを認識しておらず、無効にできると思います。

1
Sunil D.

Swfを正しく機能させるには、クロスドメインポリシーファイルを使用する必要がある場合があります。

http://kb2.Adobe.com/cps/142/tn_14213.html

1
Hades

私はこの方法で解決しましたが、server2でセッション変数を保持するとアプリケーションのスケーラビリティが低下するため、HTML5ローカルストレージを使用してWebサービスを安らかにする方がよいでしょう。これが、サードパーティのCookieの問題を解決するために使用したコードです。基本的にserver1のゲストは「コイン:D」を取るために最初にserver2に行き、突然彼はserver1に戻ります。このようにして、server2のセッション変数はすべてのナビゲーションで使用できます。 www.yourserver.com/index.htmlページ

<script src="js/jquery.cookie.js" type="text/javascript"></script>
<script src="js/mobile-detect.js" type="text/javascript"></script>
<script>
var md = new MobileDetect(window.navigator.userAgent);
if (md.userAgent()=='Safari') {
    var firstsafariuser = $.cookie('safari-user');
    if (firstsafariuser != 'true') {
        $.cookie('safari-user', true);
        location.href='http://www.yourserver2.com/coin.php?frompage='
        +location.href.replace(location.hash,"")+'&hashtags='+location.hash.substr(1);
    }
}
</script>

www.yourserver2.com/coin.php

<?php
session_start(); 
if (isset($_GET["frompage"])&&$_GET["frompage"]!=null){
    $url=$_GET["frompage"];
} else {
    $url='http://www.yourserver.com';
}
if (isset($_GET["hashtags"])&&$_GET["hashtags"]!=null){
    $hash='#'.$_GET["hashtags"];
} else {
    $hash='';
}
header('Location:'.$url.$hash);
?>

P.S. window.openは一種のポップアップのように見えるため、広告ブロッカーやブラウザの設定に問題がある可能性があります。

1
Marcello Kad

Safari.xxxページにsetTimeoutやjqueryを使用せずにクリーンな方法を追加するだけです。最新のiOS(8.1.2)で正常に動作します。8.1.0では、ウィンドウ/タブが閉じないバグがありました。

コードは次のとおりです。

<%
request.getSession(true); //or anyway to set the cookie depending on your language (jsp here)
%>

<script type="text/javascript">
    window.addEventListener("load", window.close);
</script>

私の場合、ポップアップはユーザーからのクリックによって開始されるため、問題にはなりません。

0
Kim D.