SafariサードパーティCookieのiframeトリックが機能しなくなった


137

したがって、これは「サードパーティのCookieをSafariで機能させる方法」という質問の13回目の復讐ですが、おそらく2012年2月以降、競争の場が変わったと思うので、もう一度尋ねます。3番目を取得するための標準的なトリックの1つSafariのパーティーCookieは次のとおりです。JavaScriptを使用して非表示のiframeにPOSTします。これは、Safariをだましてユーザーがサードパーティのコンテンツを操作したと考えさせ、Cookieを設定できるようにします。

私が考えるこの抜け穴はそれはGoogleがその広告でそのトリックを使用していたことが明らかにされた軽度のスキャンダルをきっかけに閉鎖されています。少なくとも、このトリックを使用している間、SafariでCookieを設定することは完全にできませんでした。私はAppleが抜け穴をふさいでいると主張していたいくつかのランダムなインターネット投稿を発掘しましたが、公式の言葉は見つかりませんでした。

フォールバックとして、コンテンツをロードする前にボタンをクリックする必要があるようにメインのサードパーティフレームを再設計してみましたが、そのレベルの直接的な対話でさえSafariの冷たい冷たい心を溶かすには不十分でした。

それで、Safariが本当にこの抜け穴を閉じたかどうか、誰かが確実に知っていますか?その場合、他の回避策はありますか(すべてのリクエストにセッションIDを手動で含めること以外)?


21
Cookieを必要とするサードパーティのiframeを使用すること明らかにセキュリティ攻撃ではありませ。私たちはさまざまなドメインのiframeで使用されているウェブショップを運営しており、最近のSafariにはさまざまな問題があるため、この(正当な)質問への回答にも非常に興味があります。
mscha

14
Facebookアプリを作成するほとんどすべての人が、Safariでこの問題を抱えています。Facebookアプリはiframeで実行され、定義により、すべてサードパーティから提供されます。これが、FacebookアプリでのSafariのサポートが少しむらがある理由です。Cookieは使用できません。
gs hurley

Safari 5.1.7ではこの問題を再現できません。デフォルトの「サードパーティCookieなし」設定で、FacebookアプリのiframeからのCookieを受け入れます。ただし、同じ設定のChrome 19.0.1084.46はCookieをブロックします。
Evgeny Shadchnev

4
(ありがたいことに)デフォルトではない「サードパーティのCookieとサイトデータをブロックする」オプションがオンになっているChrome 19以降は、Safariのデフォルトの「サードパーティと広告主からのCookieをブロックする」設定よりも/さらに厳しい/です。Chromeでは、サードパーティのドメインにアクセスしてCookieを設定しても、iframeに送信されません。ユーザーは実際にChromeのセキュリティ設定でドメインの「例外」を追加する必要があります。
アーロンヒブラルター、2012年

2012年2月とはどういう意味ですか?Safariに技術的な変更や法律の変更はありますか?
液体

回答:


51

ユーザーの操作を必要しない簡単な作業ソリューションをここに残したいだけです

私が作っ投稿で述べたように:

基本的に必要なことは、top.locationにページをロードし、セッションを作成してFacebookにリダイレクトすることだけです。

このコードをの上部に追加し、アプリケーションの最終タブまたはアプリケーションのURLにindex.php設定$page_urlすると、アプリケーションが問題なく動作することがわかります。

<?php
    // START SAFARI SESSION FIX
    session_start();
    $page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
    if (isset($_GET["start_session"]))
        die(header("Location:" . $page_url));

    if (!isset($_GET["sid"]))
        die(header("Location:?sid=" . session_id()));
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid):
?>
   <script>
        top.window.location="?start_session=true";
    </script>
<?php
    endif;
    // END SAFARI SESSION FIX
?>

注:これはFacebook用に作成されましたが、実際には他の同様の状況で機能します。


2012年12月20日の編集-署名付きリクエストの維持:

上記のコードでは、リクエストの投稿データが維持されないため、アプリケーションが署名付きリクエストに依存している場合は、次のコードを自由に試してみてください。

注:これはまだ適切にテストされており、最初のバージョンより安定性が低い可能性があります。ご自身の責任で使用してください/フィードバックをいただければ幸いです。

(解決策を改善できるように、ここで正しい方向を示してくれたCBroeに感謝します)

// Start Session Fix
session_start();
$page_url = "http://www.facebook.com/pages/.../...?sk=app_...";
if (isset($_GET["start_session"]))
    die(header("Location:" . $page_url));
$sid = session_id();
if (!isset($_GET["sid"]))
{
    if(isset($_POST["signed_request"]))
       $_SESSION["signed_request"] = $_POST["signed_request"];
    die(header("Location:?sid=" . $sid));
}
if (empty($sid) || $_GET["sid"] != $sid)
    die('<script>top.window.location="?start_session=true";</script>');
// End Session Fix

ありがとう、魅力のように機能し、既存のアプリに簡単に実装できます:-)
SamiSalami

つまり、これは基本的にいくつかのリダイレクトで機能しますよね?
アーロンヒブラルター、2012年

1
@hugoderhungrigeどういたしまして、新しいバージョンを追加しました。アプリで署名付きリクエストを維持する必要がある場合は、お気軽にチェックしてください。
Diogo Raminhos

1
@CBroe指摘いただきありがとうございます!2回目のリクエストでユーザーがすでにセッションを開始しているので、正解です。「最悪のブラインドは見たくない」と思います。
Diogo Raminhos

1
@Whiteagle 1と2を示すテストケースを提供できますか?
Gajus 2014

35

コンテンツが読み込まれる前に、ユーザーにボタンをクリックしても構わないと言っていました。私の解決策は、ボタンで新しいブラウザウィンドウを開くことでした。そのウィンドウは私のドメインにCookieを設定し、オープナーを更新してから閉じます。

したがって、メインスクリプトは次のようになります。

<?php if(count($_COOKIE) > 0): ?>
<!--Main Content Stuff-->
<?php else: ?>
<a href="/safari_cookie_fix.php" target="_blank">Click here to load content</a>
<?php endif ?>

すると、safari_cookie_fix.phpは次のようになります。

<?php
setcookie("safari_test", "1");
?>
<html>
    <head>
        <title>Safari Fix</title>
        <script type="text/javascript" src="/libraries/prototype.min.js"></script>
    </head>
    <body>
    <script type="text/javascript">
    document.observe('dom:loaded', function(){
        window.opener.location.reload();
        window.close();
    })
    </script>
    This window should close automatically
    </body>
</html>

そのようなことを考えていました。完璧に動作します。許可ダイアログとともにロードします。ありがとう!
vwoelm

これはSafariの設定にも影響を与えているようで、一般的な知識になると、他の「ソリューション」と同じように対処できるようになります。適切な方法で使用した場合でも、サードパーティのCookieが悪魔であることが明らかになりつつあるため、私は完全に別のソリューションを探しています。
LocalPCGuy

1
この解決策は私にとってうまくいきましたが、ポップアップは必要ですか?iframeをサファリページにリダイレクトし、Cookieを設定してから、リダイレクトヘッダーを使用してゲームにリダイレクトできますか?または、ユーザーがサーバーと直接何らかの形で連絡できるように、ポップアップが必要ですか?
アンソニーヘイスティングス

これはうまくいきました。幸い、これを初期化するためのボタンを押すことは、私のアプリでは大した問題ではありませんでした。
リトルレッド2012

@LocalPCGuyポップアップがブロックされないようにするには、ユーザーが実際にページをクリック/操作する必要があるため、他のソリューションと同じように使用できるとは思いません。Safariが考案したこのソリューションはうまく機能しているようです。広告主はクロスドメインCookieを密かに設定することができず、埋め込みアプリはCookieを設定する前にユーザーが対話する必要があります。
アーロンヒブラルター、2012年

15

.htaccessでSafariをだましました:

#http://www.w3.org/P3P/validator.html
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"NOI DSP COR NID CUR ADM DEV OUR BUS\""
Header set Set-Cookie "test_cookie=1"
</IfModule>

そして、それも私のために働かなくなりました。私のすべてのアプリがSafariでセッションを失い、Facebookからリダイレクトされています。これらのアプリの修正を急いでいるため、現在解決策を探しています。投稿しておきます。

編集(2012-04-06):どうやらAppleは5.1.4で「修正」したようです。これはGoogleに対する反応だと思います。「Cookieポリシーの適用に問題がありました。Safariの「Cookieをブロックする」設定がデフォルト設定の「」に設定されている場合、サードパーティのWebサイトがCookieを設定する可能性があります。サードパーティおよび広告主から」。http://support.apple.com/kb/HT5190


1
どうやらAppleは5.1.4で「修正」したようだ。これはGoogleに対する反応だと思います。 「Cookieポリシーの適用に問題がありました。Safariの「Cookieをブロックする」設定がデフォルト設定の「」に設定されている場合、サードパーティのWebサイトがCookieを設定する可能性があります。 「第三者や広告主から。 support.apple.com/kb/HT5190
vwoelm

1
したがって、vwoelmによるこのコメントは、私が探していた答えに最も近いと思います。何よりもまず、私はAppleが抜け穴を確実に閉じ、Appleサポート記事への参照がそれだけであることの確認を求めていました。私の質問の2番目の部分はまだ関係があります。回避策のオプションの範囲は何ですか。明らかに、セッションIDをGET / POSTパラメータとしてエンコードできますが、他のオプションは何ですか。ローカルストレージはこのコンテキストで機能しますか?フラッシュクッキー?
gs hurley

@vwoelm:それは確かに私が探していた(しかし望んでいない)答えです。これをコメントではなく回答に入れると、賞金が割り当てられます。
mscha 2012

3
@gshurley GET / POSTパラメータを介してセッションIDを送信することが唯一のオプションだと思います。安全ではありませんが、FacebookはとにかくSSLなしでキャンバスアプリを提供することを強制しています。また、Facebookアプリをハックすることで実際に何が得られるのでしょうか。私たちはAppleのなすがままであり、彼らは現在残酷なモードにいます。
hekevintran 2012

14

Ruby on Railsコントローラーでは、以下を使用できます。

private

before_filter :safari_cookie_fix

def safari_cookie_fix
  user_agent = UserAgent.parse(request.user_agent) # Uses useragent gem!
  if user_agent.browser == 'Safari' # we apply the fix..
    return if session[:safari_cookie_fixed] # it is already fixed.. continue
    if params[:safari_cookie_fix].present? # we should be top window and able to set cookies.. so fix the issue :)
      session[:safari_cookie_fixed] = true
      redirect_to params[:return_to]
    else
      # Redirect the top frame to your server..
      render :text => "<script>alert('start redirect');top.window.location='?safari_cookie_fix=true&return_to=#{set_your_return_url}';</script>"
    end
  end
end

サファリのセッションでも同様の問題はありますか?
Rails初心者、

iframe内にいるため、set_your_return_urlをr​​equest.env ['HTTP_REFERER']に置き換えることができます:-D
Luc Boissaye

私はこの解決策を試しましたが、唯一の問題は、親のiframeのURLに戻れないことです。Railsに親iframeのURLを取得するメソッドはありますか?ありがとう
idejuan 2015

時間はかかりましたが、最後に、最も簡単な方法(TMO)は、それを単にクエリ文字列パラメーターとしてRailsアプリのリダイレクトURLに追加することであることがわかりました。ワッシーできれい。
guyaloni

1
この答えはオープンリダイレクタを作成しますが、これは一般的なセキュリティ問題です。危険なコードはredirect_to params[:return_to]です。そのパラメーターは、リダイレクト先の安全な場所のホワイトリストに対してチェックする必要があります。owasp.org/index.php/…を
phylae

13

私の特定の状況では、window.postMessage()を使用してユーザーの操作を排除することで問題を解決しました。これは、親ウィンドウでなんらかの方法でjsを実行できる場合にのみ機能することに注意してください。ドメインからのjsを含めるか、ソースに直接アクセスできる場合。

iframe(domain-b)でCookieの存在を確認し、設定されていない場合は親(domain-a)にpostMessageを送信します。例えば;

if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1
    && document.cookie.indexOf("safari_cookie_fix") < 0) {
    window.parent.postMessage(JSON.stringify({ event: "safariCookieFix", data: {} }));
}

次に、親ウィンドウ(domain-a)でイベントをリッスンします。

if (typeof window.addEventListener !== "undefined") {
    window.addEventListener("message", messageReceived, false);
}

function messageReceived (e) {
    var data;

    if (e.origin !== "http://www.domain-b.com") {
        return;
    }

    try {
        data = JSON.parse(e.data);
    }
    catch (err) {
        return;
    }

    if (typeof data !== "object" || typeof data.event !== "string" || typeof data.data === "undefined") {
        return;
    }

    if (data.event === "safariCookieFix") {
        window.location.href = e.origin + "/safari/cookiefix"; // Or whatever your url is
        return;
    }
}

最後に、サーバー(http://www.domain-b.com/safari/cookiefix)でCookieを設定し、ユーザーの元の場所にリダイレクトします。以下の例はASP.NET MVCを使用しています

public class SafariController : Controller
{
    [HttpGet]
    public ActionResult CookieFix()
    {
        Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "1"));

        return Redirect(Request.UrlReferrer != null ? Request.UrlReferrer.OriginalString : "http://www.domain-a.com/");
    }

}

postMessageの呼び出しで構文エラーが発生していませんか?
akousmata 2015

二番目のパラメータを追加する必要があり"*"PostMessage構文エラーを修正するために
マイケルBaldry

この回答にもっと賛成票を入れたいと思います。これは、この問題に実際に対処する最も簡単で最も正しい方法です。投稿ありがとうございます!
AaronP 2016

9

私は同じ問題を抱えていましたが、今日は私にとってうまく機能する修正を見つけました。ユーザーエージェントが含まれSafari、Cookieが設定されていない場合、ユーザーをOAuthダイアログにリダイレクトします。

<?php if ( ! count($_COOKIE) > 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')) { ?>
<script type="text/javascript">
    window.top.location.href = 'https://www.facebook.com/dialog/oauth/?client_id=APP_ID&redirect_uri=MY_TAB_URL&scope=SCOPE';
</script>
<?php } ?>

認証と許可の要求の後、OAuthダイアログは一番上の場所にある私のURIにリダイレクトします。したがって、Cookieの設定が可能です。すべてのキャンバスアプリとページタブアプリについて、次のスクリプトを既に含めています。

<script type="text/javascript">
    if (top.location.href==location.href) top.location.href = 'MY_TAB_URL';
</script>

したがって、ユーザーは有効なCookieがすでに設定されたFacebookページのタブに再度リダイレクトされ、署名されたリクエストが再度投稿されます。


これで素晴らしい仕事。Chromeのユーザーエージェント文字列にもSafariが含まれているため、ユーザーエージェントチェックを更新して、Chromeがユーザーエージェントにも含まれていないことを確認しました。ドメインのページにリダイレクトし、必要なCookie /開始セッションを設定してから、apps.facebook.comのアプリにリダイレクトするのは、魅力的なものでした。ばかげているようですが、うまく機能します。先端をありがとうSascha!
Mike

7

PHPで明示的にCookieを設定しているため、Saschaが提供したものと同様の解決策を最終的に採用しましたが、少し調整しました。

// excecute this code if user has not authorized the application yet
// $facebook object must have been created before

$accessToken = $_COOKIE['access_token']

if ( empty($accessToken) && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') ) {

    $accessToken = $facebook->getAccessToken();
    $redirectUri = 'https://URL_WHERE_APP_IS_LOCATED?access_token=' . $accessToken;

} else {

    $redirectUri = 'https://apps.facebook.com/APP_NAMESPACE/';

}

// generate link to auth dialog
$linkToOauthDialog = $facebook->getLoginUrl(
    array(
        'scope'         =>  SCOPE_PARAMS,
        'redirect_uri'  =>  $redirectUri
    )
);

echo '<script>window.top.location.href="' . $linkToOauthDialog . '";</script>';

これが行うことは、ブラウザがSafariのときにCookieが使用可能かどうかを確認することです。次のステップでは、アプリケーションドメイン、つまり上記のURL_WHERE_APP_IS_LOCATEDとして提供されたURIを使用します。

if (isset($_GET['accessToken'])) {

    // cookie has a lifetime of only 10 seconds, so that after
    // authorization it will disappear
    setcookie("access_token", $_GET['accessToken'], 10); 

} else {

  // depending on your application specific requirements
  // redirect, call or execute authorization code again
  // with the cookie now set, this should return FB Graph results

}

したがって、アプリケーションドメインにリダイレクトした後、Cookieが明示的に設定され、ユーザーを承認プロセスにリダイレクトします。

私の場合(CakePHPを使用しているため、他のMVCフレームワークでも問題なく機能するため)FB認証がもう一度実行されるログインアクションを再度呼び出していますが、今回は既存のCookieが原因で成功します。

アプリを1回承認した後、Safari(5.1.6)でアプリを使用する際に問題は発生しなくなりました。

それが誰にも役立つことを願っています。


1
これは私のために働きました!! ありがとう!! ..私はSafari 5.1.7でこの問題を抱えていました....解決しました!
Khalizar

5

iOSを実行しているデバイスでこの問題が発生しました。iframeを使って通常のウェブサイトに埋め込めるショップを作りました。どういうわけか、ページロードのたびにユーザーは新しいセッションIDを取得し、一部の値がセッションに存在しなかったため、ユーザーはプロセスの途中で行き詰まってしまいました。

このページで提供されているソリューションのいくつかを試しましたが、iPadではポップアップがうまく機能せず、最も透過的なソリューションが必要でした。

リダイレクトを使用して解決しました。私のサイトを埋め込むWebサイトは、最初にユーザーを私のサイトにリダイレクトする必要があるため、上のフレームには私のサイトへのURLが含まれています。ここで、Cookieを設定し、ユーザーを、自分のサイトを埋め込むWebサイトの適切なページにリダイレクトします。 URLを介して。

PHPコードの例

リモートWebサイトがユーザーをリダイレクトする

http://clientname.example.com/init.php?redir=http://www.domain.com/shop/frame

init.php

<?php
// set a cookie for a year
setcookie('initialized','1',time() + 3600 * 24 * 365, '/', '.domain.com', false, false);
header('location: ' . $_GET['redir']);
die;

ユーザーはhttp://www.domain.com/shop/frame私のサイトが埋め込まれている場所に行き、セッションを適切に保存し、Cookieを食べます。

これが誰かを助けることを願っています。


3

ASP.NET MVC 4での修正を共有しましょう。PHPの正解のような主なアイデア。スクリプトの近くのヘッダーのメインレイアウトに追加された次のコードセクション:

@if (Request.Browser.Browser=="Safari")
{
    string pageUrl = Request.Url.GetLeftPart(UriPartial.Path);
    if (Request.Params["safarifix"] != null && Request.Params["safarifix"] == "doSafariFix")
    {
        Session["IsActiveSession"] = true;
        Response.Redirect(pageUrl);
        Response.End();
    }
        else if(Session["IsActiveSession"]==null)
    {
        <script>top.window.location = "?safarifix=doSafariFix";</script>
    }
}

3

このソリューションはいくつかの場合に適用されます-可能であれば:

iframeコンテンツページがiframeを含むページのサブドメインを使用する場合、Cookieはブロックされなくなりました。


これは有用な情報です-私が探していたものだけです。ほとんどの人は周りのドメインを変更できないと確信していますが、それは私がやろうとしていることです。私が埋め込んでいるサイトで、<mycompany>。<theircompany> .comサブドメインを作成します。このサブドメインは、自分のIPとそのドメインのVHostにマップし、iFrameでそのURLを使用します。複雑ですが、防弾でなければなりません。
Elocution Safari、2015

1
サブドメインサーバーでSSL証明書を照合する必要があるため、サブドメインでhttpsを使用している場合、これは複雑になる可能性があります。
ロジャーハリバートン

1

グーグルは、実際に猫をバッグから出しました。彼らはしばらくの間、トラッキングCookieにアクセスするためにそれを使用していました。それはAppleによってほぼすぐに修正されました= \

オリジナルのウォールストリートジャーナルの投稿


Googleのことは知っているが、Appleが実際にこれを「修正」する(そしてインターネットの半分を壊す)ことについては何も見たことがない。詳細はありますか?
mscha 2012

1

ここに私が使用するいくつかのコードがあります。サイトからCookieを設定すると、それ以降、Cookieは魔法のようにiframeで機能することがわかりました。

http://developsocialapps.com/foundations-of-a-facebook-app-framework/

 if (isset($_GET['setdefaultcookie'])) {
        // top level page, set default cookie then redirect back to canvas page
        setcookie ('default',"1",0,"/");
        $url = substr($_SERVER['REQUEST_URI'],strrpos($_SERVER['REQUEST_URI'],"/")+1);
        $url = str_replace("setdefaultcookie","defaultcookieset",$url);
        $url = $facebookapp->getCanvasUrl($url);
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    } else if ((!isset($_COOKIE['default'])) && (!isset($_GET['defaultcookieset']))) {
        // no default cookie, so we need to redirect to top level and set
        $url = $_SERVER['REQUEST_URI'];
        if (strpos($url,"?") === false) $url .= "?";
        else $url .= "&";
        $url .= "setdefaultcookie=1";
        echo "<html>\n<body>\n<script>\ntop.location.href='".$url."';\n</script></body></html>";
        exit();
    }

1

他の人が投稿したもののわずかに単純なバージョンのPHP:

if (!isset($_COOKIE, $_COOKIE['PHPSESSID'])) {
    print '<script>top.window.location="https://example.com/?start_session=true";</script>';
    exit();
}

if (isset($_GET['start_session'])) {
    header("Location: https://apps.facebook.com/YOUR_APP_ID/");
    exit();
}

1

私はこれに対する完璧な答えを見つけました。これはすべて、ここですべての信用に値するアランと呼ばれる男のおかげです。(http://www.allannienhuis.com/archives/2013/11/03/blocked-3rd-party-session-cookies-in-iframes/

彼の解決策はシンプルで理解しやすいものです。

iframeコンテンツサーバー(ドメイン2)で、ルートドメインレベルにstartsession.phpというファイルを追加します。

<?php
// startsession.php
session_start();
$_SESSION['ensure_session'] = true;
die(header('location: '.$_GET['return']));

これで、iframe(domain1)を含むトップレベルのWebサイトでは、iframeを含むページへの呼び出しは次のようになります。

<a href="https://domain2/startsession.php?return=http://domain1/pageWithiFrame.html">page with iFrame</a>

以上です!シンプル:)

これが機能する理由は、ブラウザをサードパーティのURLに誘導し、iframe内のコンテンツを表示する前にそれを信頼するようにブラウザに指示するためです。


0

私は修正済み(signed_requestパラメータをリンクに追加)Whiteagleのトリックを使用しましたが、サファリでは問題なく機能しましたが、その場合、IEは常にページを更新しています。したがって、サファリとInternet Explorerの私のソリューションは次のとおりです。

$fbapplink = 'https://apps.facebook.com/[appnamespace]/';
$isms = stripos($_SERVER['HTTP_USER_AGENT'], 'msie') !== false;

// safari fix
if(! $isms  && !isset($_SESSION['signed_request'])) {

    if (isset($_GET["start_session"])) {
        $_SESSION['signed_request'] = $_GET['signed_request'];
        die(header("Location:" . $fbapplink ));

    }
    if (!isset($_GET["sid"])) {
        die(header("Location:?sid=" . session_id() . '&signed_request='.$_REQUEST['signed_request']));
    }
    $sid = session_id();
    if (empty($sid) || $_GET["sid"] != $sid) {
    ?>
    <script>
        top.window.location="?start_session=true";
    </script>
    <?php
    exit;
    }
}

// IE fix
header('P3P: CP="CAO PSA OUR"');
header('P3P: CP="HONK"');


.. later in the code

$sr = $_REQUEST['signed_request'];
if($sr) {
        $_SESSION['signed_request'] = $sr;
} else {
        $sr = $_SESSION['signed_request'];
}

0

私もこの問題に苦しんでいますが、最終的に解決策が得られました。最初にブラウザにiframeのURLを小さなポップアップのように直接ロードし、iframe内のセッション値にのみアクセスします。


-1

最近、Safariで同じ問題に遭遇しました。私が考え出したソリューションは、ローカルストレージHTML5 APIに基づいています。ローカルストレージを使用すると、Cookieをエミ​​ュレートできます。

詳細はこちらのブログ投稿です:http : //log.scalemotion.com/2012/10/how-to-trick-safari-and-set-3rd-party.html



-2

私は取り除くことを決めた$_SESSIONすべて一緒に変数&セッションを模倣するためにmemcacheの周りのラッパーを書きました。

https://github.com/manpreetssethi/utils/blob/master/Session_manager.phpを確認してください

使用例:ユーザーがアプリにアクセスした瞬間に、Session_managerを使用して署名付きリクエストを保存します。これはキャッシュ内にあるため、以降はどのページからでもアクセスできます。

注:ページがリロードされるたびにsession_idがリセットされるため、Safariでプライベートブラウジングを行う場合、これは機能しません。(愚かなサファリ)


-9

ヘッダーをp3pポリシーとして追加することでこの問題を解決できます。サファリで同じ問題があったので、ファイルの上部にヘッダーを追加すると問題が解決しました。

<?php
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
?>

これは(まだ)Safariの最新バージョンで動作しますか?IEには何年もP3Pヘッダーがありましたが、Safariはまだ壊れています。
mscha 2012

2
すべてのCookieをクリアして、もう一度テストしてください。お使いのブラウザーにiframedサイトのCookieがすでにある場合、問題はそれ自体は表示されません。
rmarscher

うーん、P3Pヘッダーも機能しません。IEでも動作します!
セスブラウン

2
これは以前は機能していました。しかし、最新バージョンのSafariではサポートされていません。キャッシュをクリアして、もう一度お試しください...
chantheman

2
このソリューションが機能することを述べたいと思います。Safari上のすべてのCookieを削除してください。そして、これを試してください。
dnuske '17
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.