Междоменный доступ к файлам cookie (или сеанс)

Хотя я понимаю, что это обычно связано с атаками межсайтового скриптинга, мне интересно, как сеанс может оставаться действительным в нескольких поддоменах, принадлежащих одному домену (пример: пользователь входит в систему только один раз и имеет доступ к обоим subdomain1.domain.com и subdomain2.domain.com с одним и тем же сеансом). Думаю, сначала мне нужно понять, как это работает, но пока мне не удалось найти много полезного.

Но опять же, может быть, я задал не тот вопрос.

Заранее спасибо :)


person mtranda    schedule 02.06.2009    source источник


Ответы (7)


Сеансы Inproc не могут оставаться действительными, однако вы можете запрограммировать свое веб-приложение, чтобы разрешать использование файлов cookie в нескольких поддоменах. Вам нужно будет установить домен равным:

Response.Cookies("CookieName").Domain = ".mydomain.com"

Запомните период.

person Community    schedule 02.06.2009
comment
Невозможно установить файлы cookie в другом домене. Он должен находиться под вашим собственным доменом. - person aleemb; 02.06.2009
comment
Название говорит об этом, но если вы прочитаете, что он спрашивает, он отчетливо говорит о поддоменах. - person ; 02.06.2009

Существует несколько способов обмена данными сеанса или файлами cookie между доменами. Самый простой — поделиться им на стороне сервера через общее хранилище данных. Но вы бы не задавали этот вопрос, если бы это было так просто.

Другой способ сделать это столь же прост. Домен one.com содержит некоторые данные сеанса, например name=aleem и id=123, и хочет передать их two.com. Он будет следовать следующим шагам:

  1. Позвоните two.com/api/?name=aleem&id=123
  2. Когда two.com получает данные через параметры запроса, он создает файл cookie с данными. Этот файл cookie будет храниться в домене two.com.
  3. Затем two.com перенаправит обратно на REFERER, который в данном случае оказывается one.com.

Это упрощенный сценарий. Домен two.com должен иметь возможность доверять one.com, и не только это, но он должен знать, что запрос является подлинным, а не просто созданным пользователем, поэтому вам нужно использовать открытые/закрытые ключи, чтобы смягчить это.

person aleemb    schedule 02.06.2009

По умолчанию все файлы cookie для сайта хранятся вместе на клиенте, и все файлы cookie отправляются на сервер с любым запросом к этому сайту. Другими словами, каждая страница сайта получает все файлы cookie для этого сайта. Однако вы можете установить объем файлов cookie двумя способами:

  1. Ограничьте область действия файлов cookie папкой на сервере, что позволяет ограничить использование файлов cookie приложением на сайте.
  2. Установите область для домена, что позволяет указать, какие поддомены в домене могут получить доступ к файлу cookie.

Вы можете узнать больше здесь.

person Shoban    schedule 02.06.2009

Комментарии о том, что файл cookie, установленный для домена, позволяет поддоменам получать этот файл cookie, дают вам эту сторону, но чего не хватает, так это согласованности сеанса.

Я думаю, что это очень похоже на проблему поддержания состояния на серверах в ферме, и решение, вероятно, состоит в том, чтобы обеспечить согласованность вашего хранилища сеансов на обоих сайтах (если они не являются серверами с одного и того же «веб-сайта» в IIS). Вы можете переместить хранилище сеансов в SQL Server (КАК: настроить SQL Server для хранения состояния сеанса ASP.NET), что, вероятно, послужит цели, поскольку каждый сайт будет запрашивать одно и то же хранилище при поиске данных сеанса, связанных с файлом cookie, с которым они были представлены.

Я надеюсь, что вы на правильном пути.

person Lazarus    schedule 02.06.2009

Если у вас есть возможность настроить общий субдомен, вы можете сделать это:

В html-файлы вашего поддомена включите файл javascript вверху, например:

<script src="http: //common.domain.com/check.asp"></script>

В check.asp найдите файл cookie logged_in и, если его нет, покажите страницу, скажем, http://common.domain.com/login.asp, используя что-то вроде

<%
if (cookie_not_found){
%>
location.href = "http: //common.domain.com/login.asp";
<%
}
%>

После того, как человек отправит имя пользователя и пароль, отправьте его обратно на тот же login.asp и установите файл cookie сеанса (который будет установлен в домене common.domain.com), а затем перенаправьте на http://subdomain1.domain.com.

Что произойдет сейчас, так это вызов встроенного «common.domain.com/check.asp», и браузер отправит файлы cookie для common.domain.com вместе с запросом. Таким образом, вы будете знать, действителен ли ваш сеанс, даже если вы находитесь в subdomain1.domain.com.

person Narayan Raman    schedule 02.06.2009

Вы можете установить cookie для определенного домена.

В php метод setCookie() содержит параметр, в котором можно указать домен верхнего уровня, поэтому файл cookie действителен для всех поддоменов. Судя по вашим тегам, вы работаете в asp.net. Вероятно, это также существует для asp ...

после небольшого поиска asp:

попробуй это:

Response.Cookies("CookieName").Domain = ".mydomain.com"

или прочитайте это

person Fortega    schedule 02.06.2009
comment
Но вы отредактировали его снова (?) Я не вижу второй код в первый раз ;-) - person Shoban; 02.06.2009
comment
Безусловно, независимо от языка, используемого для демонстрации, любой ответ, демонстрирующий возможность выполнения основного требования вопроса, имеет ценность. Вы, по крайней мере, знаете, что должны продолжать следовать по пути, по которому идете. ;) - person Lazarus; 02.06.2009
comment
Вы не можете получить или установить междоменный файл cookie. Это решение не сработает. - person aleemb; 02.06.2009
comment
Вопрос заключался в следующем: мне интересно, как сеанс может оставаться действительным в нескольких поддоменах, принадлежащих одному домену. На самом деле это не похоже на междоменное для меня... - person Fortega; 02.06.2009
comment
В заголовке указано, что междоменный доступ к файлам cookie (или сеанс). Я думаю, это двусмысленно. Вы правы в своем ответе. беру обратно =) - person aleemb; 02.06.2009

Вот решение, которое работает:

http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/

person Alec Smart    schedule 18.02.2010