web-dev-qa-db-ja.com

Safariのiframe内の外部ドメインからCookieを設定するにはどうすればよいですか?

Apple 開発者向けよくある質問 から

Safariには、ユーザーが選択した(「ナビゲートした」)ページのみにCookieの書き込みを制限する保守的なCookieポリシーが付属しています。

デフォルトでは、Safariは直接移動したサイトからのCookieのみを許可します。 (つまり、そのドメイン名のURLのリンクをクリックした場合)。

つまり、自分のサイトからiFrameを使用して別のサイトのページを読み込んだ場合、他のサイトはCookieを設定できません。 (たとえば、チケットショップ)。他のドメインに直接アクセスするとすぐに、他のサイトは独自のCookieにアクセスして変更できるようになります。

他のサイトのコードにアクセスできない場合、どうすればユーザーエクスペリエンスをできるだけ目立たなくすることができますか?

他のサイトのCookieがすでに設定されているかどうかを確認し、必要に応じて最初に他のサイトへの直接リンクを表示する(javascript?)方法はありますか?

更新:

HTML5機能「window.postmessage」は素晴らしい解決策のようです。
役立つ可能性があり、最新のブラウザと互換性のあるjQueryライブラリがいくつかあります。
本質的に、iFrameドキュメントはJsonを使用してウィンドウ要素を介してメッセージを送信します。

とても素敵です Postmessage-plugin 、daeparkによる、私が働いた。
そして別の jQuery postMessage 、ベン・アルマンによって私は見つけましたが、テストしていません。

21
GDmac

localStorageは、safariおよびすべての最新のブラウザーでサポートされており、iframeに読み込まれたページでも読み取り/書き込み操作を許可します。 ie6とie7のサポートを終了してもかまわない場合は、フレーム化されたサイトでCookieの代わりにlocalStorageを使用してみてください。あなたの質問がフレーム化されたサイトのコードにアクセスできないと具体的に言っていることは知っていますが、アクセスできる人にとっては、localStorageは「サファリiframeにCookieがない」問題を確実に解決します。

10
colin moock

これは同一生成元ポリシーとして知られる問題です。本質的には、セキュリティの抜け穴を作成することに対するセキュリティ対策です。

自分のドメインのページを指すiframeがある場合、JavaScriptは現在のページとIframe内のページの両方にアクセスできます。これは、親と子、および子と親の関係として受け入れられます。

 (parent doc)        (iframe doc)
    HTML --> IFRAME <-- HTML 
      ^--------|---------^

ただし、外部ページを指すファイルを作成すると、SOPが機能し、親ページとiframeページの間を通過する情報をすべて停止します。

 (parent doc)        (iframe doc)
    HTML --> IFRAME <-- HTML 
               X

Iframe通信についてのこの投稿をチェックしてください、それは非常に理にかなっています! Stackoverflow post

これらのリンクも本当に役立ちます!

1)ブラウザでの安全なクロスドメイン通信
2)wiki SOPまたは同一生成元ポリシー

幸運を!

8
M.W. Felker

このページ は、常に存在するCookieがないことを検出するJavaScriptをページに配置することを提案します。 Cookieが設定されていないことが検出されると、必要なセッションデータがCookieを設定するページに送信され、元のページにリダイレクトされます。

どうやらPOSTはSafariの「このドメインに移動しましたか」テストを満たすのに十分なので、それ以降はそのドメインからのCookieを受け入れます。

もちろん、これは最高のコードではありませんが、問題を解決できる可能性があります。

3
Cyphus

1つの解決策(少し面倒)は、親ページにCookieの存在を確認させ、Cookieが存在しない場合は、iframeページのドメイン上のスクリプトへのAJAX呼び出しを実行することです。クッキーを設定します。

2
tw39124

これは、Safariに表示されるFacebookアプリの一般的な問題です。多くの人(私を含む)がこれに対処する方法は、iframeページPOSTをそれ自体に持つことです。ページがフォームデータを投稿すると、Cookieを設定できるようになります。最後に、 1ページの更新で機能します。これはユーザーログインPOSTの場合もあります。

2
Broote