19

IE10は、他の主要なブラウザー(IE8、IE9、Firefox、Chrome、Safari)とは異なる方法でCookieとサブドメインを処理するように見えます。

テスト環境では、サブドメインを幅広く使用しています。例:

  • user1.devel.example.com
  • user2.devel.example.com
  • qa.example.com

そして、私たちの本番環境は、example.com(および技術的にはwww.example.com)などの最上位にあります。

phpsetcookie($name, $value, $expires)関数を単純に(明示的なパスまたはドメインが指定されていない)使用してCookieを設定し、値に空の文字列を割り当てて(ユーザーがログアウトしたときに)Cookieをクリアします。これは常に正常に機能し、それぞれの固有のサブドメインは独自のCookieを使用していました。

IE10は、TLDで設定されたCookieをすべてのサブドメインと「共有」するようになりました。 私たちが観察した最初の症状は、誰もサブドメインからログアウトできないことでした。私たちはいくつかのことを観察しました:

  • 値を共有していても、サブドメインはCookieをクリアできません。
  • TLDがCookieをクリアすると、すべてのサブドメインからもすぐに削除されます。

IE10がサブドメインに関連してCookieを保存/適用する方法と同様の動作を他の誰かが観察しましたか?最初のSet-Cookieヘッダーを送信するときにCookieがどのドメインに適用されるかを明示する以外に、回避策はありますか?

4

4 に答える 4

16

この問題に遭遇しました。

このバグ/問題を調査している誰かへのリンクは次のとおりです: Cookies with and without the Domain Specified (browser inconsistency)

これも関連している可能性があります 。サブドメインに Cookie が設定されていますが、IE 開発者ツールはルート ドメインに Cookie を表示します。私は何が欠けていますか?

私の結論は、www 以外のルート ドメイン ( http://sites.com ) から Cookie を設定すると、IE ではこれがすべてのサブドメインのワイルドカード Cookie と見なされるということです。Chrome と Firefox はこの動作を示しません。非 www ルート ドメインからの Cookie セットを、そのルートのみに関連付けられているものとして関連付けます。

.net Web フォーム、IIS、およびホスト ファイルを使用してサンプル サイトをコーディングしました。a.site.com、b.site.com、site.com の 3 つのサイトがありました。それらはすべて、まったく同じ名前の Cookie を提供していました。「ショッピングカート」としましょう。

Cookie を関連付ける必要のあるドメインなど、Cookie に複数のプロパティを設定できます。このプロパティを.netで定義/未定義のままにしました。Chrome が各サイトから Cookie を受け取ると、Cookie のドメインがブラウザのアドレス バーにリストされているドメインから明示的に表示されました。IE では、そうではありませんでした。IE は、http: //sites.com からの Cookieを「.sites.com」として定義されているものとして扱います。Cookie の RFC によれば、これは、すべてのサブドメインからアクセスできることを意味します。

また、IE では、複数の Cookie が同じ名前で設定されている場合、IE はそれらを設定された順序でサーバーに返します。したがって、最初にhttp://sites.comにアクセスし、次にhttp://a.sites.comにアクセスしてから更新すると、IE はhttp://sites.comからのCookie をサーバーに送信する有効な Cookie と見なします。 http://a.sites.comの Cookie と一緒に送信されるhttp://a.sites.comの要求ですが、 http://sites.comの Cookieはリストの最初です。

.net では、私が見たところ、Cookie は通常、インデックスではなくキー名でアクセスされます。したがって、サーバー側のコードが「ShoppingCart」という名前のキーの値にアクセスしようとすると、Cookie の値を設定した最初のサイト (ここではhttp://sites.com ) の値が取得されます。

要約すると、すべて同じ Cookie キー名を共有するサブドメインがある場合は、非 www ドメインを使用しないでください。Chrome/Firefox はドメインの関連付けを期待どおりに処理しますが、IE はバグのある動作を引き起こすためです。

編集 -

これを読んでいる人のために明確にするために、私は IE10 を使用してこの問題を調査していました。

于 2013-06-28T18:48:12.590 に答える
3

ドメインに複数の PHP サイトがある場合、これを修正する非常に簡単な方法です。

たとえば、ルート (example.com) に Wordpress があり、サブドメイン (a.example.com) にカスタム PHP アプリがある場合、アプリまたは Wordpress 内で別の SessionName を設定する必要があります。

session_start() の前に session_name() を追加します。これにより、セッションに 2 つの個別の名前が付けられるため、衝突することはありません。

session_name('AppSession');
session_start();

簡単。

于 2016-08-03T00:50:59.240 に答える
1

はい、これは既知の問題のようです。こちらをお読みください: http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx

彼らはこのテストを参照しています: http://debugtheweb.com/test/cookieinherit.aspxおよびhttp://www.debugtheweb.com/test/cookieinherit.aspx

于 2014-04-15T07:01:27.310 に答える
0

IE 11.0.9600 で php セッション Cookie に対して同じ問題が発生しています。Internet Explorer がルート ドメイン Cookie をすべてのサブドメインに送信しています。これを解決するために、ドメイン名をセッション変数に保存します。

$_SESSION['URL'] = str_replace('www.', '', $_SERVER['HTTP_HOST']);

次に、リクエストごとにセッション変数をチェックします。

if ( str_replace('www.', '', $_SERVER['HTTP_HOST']) !=  $_SESSION['URL']) {
  session_regenerate_id(true);
  $_SESSION = array();
  $_SESSION['URL'] = str_replace('www.', '', $_SERVER['HTTP_HOST']);
}

次に、ルート ドメインからサブドメインに移動すると、同じセッションに「参加」しなくなります。

于 2014-02-06T07:55:19.700 に答える