Могут ли браузеры реагировать на Set-Cookie, указанный в заголовках в запросе XSS jquery.getJSON ()? - PullRequest
0 голосов
/ 24 ноября 2010

(Примечание. Это продолжение моего вопроса Может ли jQuery.getJSON поместить файлы cookie домена в заголовок запроса, который он делает? и охватывает случай XSS Настройкафайл cookie в запросе AJAX? )

Мне сказали, что я не могу установить файлы cookie для чтения другими доменами, которые не являются поддоменами текущего домена, используя $.cookie(..., ..., {domain: ...}),Но в комментарии к ответу на мой последний вопрос @zanlok сказал: «Однако ответ сервера может определенно установить cookie», и он получил два отзыва.

Поэтому я подумал, что попробую воспользоваться услугойкоторый был создан для явной цели установки файлов cookie под названием «сенсорный» API Freebase .Вызов выглядит так:

$.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, и скрипт запускает ответобработчик.Тем не менее, cookie не присутствует в заголовках запросов для последующих запросов JSON, которые этот сценарий делает равными .sandbox-freebase.com.

(В отличие от этого, просто введите URL-адрес touch api в адресную строку и загрузите его таким образом,cookie для будущих запросов. Это применимо даже в других вкладках.)

Похоже, что это отклонение от предыдущего "ожидаемого поведения", поскольку MetaWeb опубликовал примерно "2007-2009", который, казалось,думаю, что такой подход может сработать:

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

Не зная об этом, я задаюсь вопросом, было ли это недавнее изменение, принятое Firefox, и затем WebKit последовал его примеру.Возможно, упомянутое здесь:

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

Так есть ли какие-либо канонические документы по этому конкретному вопросу?

Ответы [ 2 ]

4 голосов
/ 02 декабря 2010

AJAX-вызов, который вы делаете, делает запрос к домену за пределами домена URL верхнего уровня (URL в адресной строке).Это приводит к тому, что он является сторонним cookie, по умолчанию Internet Explorer не сохраняет сторонний cookie.Это означает, что cookie будет возвращаться в заголовке Set-Cookie при первом запросе, но последующие запросы, которые вы отправляете на этот сервер, не будут отправлять этот cookie в запросе.

Как вы сказали, если вы идетепрямо на URL в вашем браузере это работает.Это связано с тем, что в данном случае это файл cookie первой стороны.

Чтобы IE мог принимать файлы cookie третьей стороны, сервер, отправляющий заголовок SET-COOKIE в своем ответе, также должен иметь установленный заголовок политики P3P.

Вот пример, когда вы переходите к CNN, вы заметите, что один из запросов, которые он делает, относится к доменному имени 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, специфичный для вашего бизнеса, но вышеописанное должно работать для целей тестирования.

1 голос
/ 24 ноября 2010

Если я правильно вас понимаю, вам интересно, почему сервер отправляет Set-Cookie только по первому запросу.Если это правда, то это по замыслу - посмотрите здесь:

Set-Cookie как установщик - сервер отправляет его длябраузер для локального кеширования.Он может отправлять каждый раз, но в этом нет необходимости, поэтому он отправит его снова, только если ему нужно изменить значение, хранящееся локально.

Браузер, с другой стороны, будет каждый раз отправлять заголовок Cookie с содержимым, установленным последним Set-Cookie с сервера.

...