0

(注: これは、私の質問Can jQuery.getJSON put a domain's cookies in the header of the request it make?へのフォローアップであり、AJAX リクエストで Cookie を設定するXSS ケースをカバーしています。 )

を使用して、現在のドメインのサブドメインではない他のドメインが Cookie を読み取るように設定できないと言われました$.cookie(..., ..., {domain: ...})。しかし、私の最後の質問への回答に対するコメントで、@zanlok は「ただし、サーバーの返信は間違いなく Cookie を設定できる」と述べ、2 つの賛成票を獲得しました。

そこで、 Freebase の「touch」APIと呼ばれる Cookie を設定するという明確な目的のために作成されたサービスを使用してみようと考えました。呼び出しは次のようになります。

$.getJSON("http://api.sandbox-freebase.com/api/service/touch",
{}, // URL parameters
afterCookieIsSetCallback); // Callback function

応答ヘッダーで FireBug を見ると、次のようになります。

Date    Wed, 24 Nov 2010 03:35:28 GMT
Server  Apache
X-Metaweb-Cost  [...]
Etag    [...]
Expires Wed, 24 Nov 2010 03:35:29 GMT
Cache-Control   no-store
Vary    Accept-Encoding
Content-Encoding    gzip
Set-Cookie  mwLastWriteTime=1290569730|10325_9202a8c04000641f80000000199eff96|sandbox; expires=Thu, 25-Nov-2010 03:35:28 GMT; Path=/
Last-Modified   Wed, 24 Nov 2010 03:35:28 GMT
Content-Length  134
Content-Type    text/plain; charset=utf-8
X-Cache MISS from cache01.sandbox.sjc1.metaweb.com
Connection  keep-alive
X-Metaweb-TID   cache;cache01.sandbox.sjc1:8101;2010-11-24T03:35:28Z;0001

したがって、そこには間違いなく Set-Cookie があり、スクリプトは応答ハンドラーを実行します。しかし、このスクリプトが.sandbox-freebase.com.

(対照的に、タッチ API の URL をアドレス バーに入力して読み込むだけで、今後の要求のために Cookie が設定されます。これは、他のタブにも適用されます。)

これは、「2007 年から 2009 年」頃に MetaWeb によって公開されたツールキットがあり、そのようなアプローチが機能すると思われるため、以前の「予想される動作」からの逸脱のようです。

http://www.google.com/codesearch/p?hl=en#v099O4eZ5cA/trunk/src/freebase/api.js&q=touch%20パッケージ:http://mjt%5C.googlecode%5C.com&l=340

それについてあまり知らないので、Firefox が採用した最近の変更であり、その後 WebKit がそれに続いたのではないかと思っています。おそらくここで言及されているもの:

http://trac.webkit.org/browser/trunk/WebCore/xml/XMLHttpRequest.cpp#L856

この特定の問題に関する正規のドキュメントはありますか?

4

2 に答える 2

4

あなたが行っているAJAX呼び出しは、トップレベルのURL(アドレスバーのURL)のドメイン外のドメインにリクエストを行っています。これにより、サード パーティの Cookie が生成されます。デフォルトでは、Internet Explorer はサード パーティの Cookie を保持しません。つまり、最初のリクエストでは Cookie が Set-Cookie ヘッダーに返されますが、そのサーバーに対して行う後続のリクエストでは、その Cookie がリクエストで送信されません。

あなたが言ったように、ブラウザのURLに直接アクセスすると機能します。これは、この場合はファースト パーティ Cookie であるためです。

IE がサード パーティの Cookie を受け入れるためには、そのSET-COOKIE応答でヘッダーを送信するサーバーにも P3P ポリシー ヘッダーが設定されている必要があります。

以下に例を示します。CNN に移動すると、要求の 1 つが b.scorecardresearch.com のドメイン名に対するものであることがわかります。scorecardresearch は追跡 Cookie をドロップしていますが、この Cookie はサードパーティの Cookie と見なされます。したがって、機能させるには、ヘッダーも含める必要がありました。以下のp3pヘッダーを参照してください。

HTTP/1.1 200 OK
Content-Length: 43
Content-Type: image/gif
Date: Thu, 02 Dec 2010 19:57:16 GMT
Connection: keep-alive
Set-Cookie: UID=133a68a4-63.217.184.91-1288107038; expires=Sat, 01-Dec-2012 19:57:16 GMT; path=/; domain=.scorecardresearch.com
P3P: policyref="/w3c/p3p.xml", CP="NOI DSP COR NID OUR IND COM STA OTC"
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Pragma: no-cache
Cache-Control: private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Server: CS

このヘッダーをコピーして応答に追加すると、Cookie が機能し始めることに気付くでしょう。

P3P: policyref="/w3c/p3p.xml", CP="NOI DSP COR NID OUR IND COM STA OTC"

ビジネスに固有の P3P ヘッダーを作成するのが最善ですが、上記はテスト目的で機能するはずです。

于 2010-12-02T20:02:31.740 に答える
1

私の理解が正しければ、なぜサーバーSet-Cookieが最初の要求でのみ送信するのか疑問に思っていることでしょう。それが本当なら、それは仕様によるものです - ここを見てください:

Set-Cookieセッターのようなものです-サーバーはブラウザに送信してローカルにキャッシュします。毎回送信できますが、その必要はないため、ローカルに保存されている値を変更する必要がある場合にのみ再送信します。

一方、ブラウザはサーバーからCookie最後に発行された内容で毎回ヘッダーを送信Set-Cookieします。

于 2010-11-24T04:34:55.287 に答える