Cookie не обновляется / перезаписывается в IE - PullRequest
9 голосов
/ 05 апреля 2010

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

  1. Клиент переходит на страницу https://secure.example.com/users/login, автоматически получая идентификатор сеанса
  2. Клиентские учетные данные POSTs входят в тот же адрес
  3. Клиент получает следующие заголовки cookie-файлов вместе с перенаправлением 302 на https://secure.example.com/users/mypage:

    CakePHP = удален; истекает = вс, 5 апреля 2009 г. 04:50:35 GMT; путь = /
    CakePHP = 98hnIO23 ...; истекает = понедельник, 12 апреля 2010 г. 04:50:36 GMT; Путь = /; обеспечение

  4. Клиент должен посетить https://secure.example.com/users/mypage, представляя новый идентификатор сеанса.

Это работает во всех браузерах, кроме IE (протестировано в 7 и 8). IE сохраняет старый, не прошедший проверку подлинности идентификатор сеанса и перенаправляется обратно на страницу входа. Он работает в моей локальной тестовой среде (используя самозаверяющий сертификат на https://localhost:8443/...), но не на живом сервере.

Я использую CakePHP и просто выдаю $this->Session->renew(), который производит вышеуказанные заголовки cookie.

Есть идеи, как заставить IE принять новый файл cookie?


Вот полный заголовок:

HTTP/1.0 302 Moved Temporarily
Date: Thu, 08 Apr 2010 02:54:30 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Set-Cookie: CAKEPHP=deleted; expires=Wed, 08-Apr-2009 02:54:30 GMT; path=/
Set-Cookie: CAKEPHP=d55c...; expires=Thu, 15 Apr 2010 02:54:31 GMT; path=/; secure
Last-Modified: Thu, 08 Apr 2010 02:54:30 GMT
Location: https://secure.example.com/users/mypage
Vary: Accept-Encoding
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8

Мне кажется, я нашел проблему: IE отправляет два куки с одинаковым именем. Вот следующий запрос к серверу:

GET /users/mypage HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, */ *
Referer: https://secure.example.com/users/login
Accept-Language: en-gb
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)
Accept-Encoding: gzip, deflate
Host: secure.example.com
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: CAKEPHP=19c6...; CAKEPHP=d55c...

Обратите внимание, что он отправляет два куки-файла, тот, который он получил после входа в систему, но также и старый. Он получил старый на главной странице example.com, установленный с path=/. Он также отправляет запрос на secure.example.com. Он не заменяется вышеуказанным заголовком, а добавляет его в качестве дополнительного файла cookie. Как я могу остановить это от этого?

Ответы [ 3 ]

4 голосов
/ 08 апреля 2010

Распространенной проблемой является то, что при второй попытке установить cookie-файл отсутствует надлежащий заголовок P3P, и поэтому попытка прикоснуться к cookie-файлу игнорируется.

Было бы полезно, если бы вы опубликовали заголовки общего потока (например, используйте Fiddler для захвата и просмотра)

3 голосов
/ 13 апреля 2010

Убедитесь, что файлы cookie отправляются для вашего базового домена.

Скорее всего, это проблема, так как это поведение, безусловно, различается в разных браузерах.

Я не делал этого в cakephp, но это должно сработать

2 голосов
/ 14 апреля 2010

У вас могут быть две проблемы здесь. Сначала дайте ссылку в @ freddy-rios, публикуя снимок. Если это не сработает, то вы можете столкнуться с IE «ошибка cookie перенаправления».

IE не всегда учитывает изменение cookie во время перенаправления. Если вы назначаете идентификатор сеанса в форме входа и не меняете его, то перенаправление должно работать нормально. Если вы изменяете cookie при перенаправлении, то вы, вероятно, в итоге получите старый сеанс ... браузер просто отправит старый cookie на новый URL (возможно, что он должен делать ... перенаправить исходный запрос ).

Есть несколько способов справиться с этим. На сегодняшний день самым уродливым является использование перенаправления тегов Javascript или META. Пока вы передаете не 300 с этими куки, браузер почти всегда будет принимать их.

Если вы используете $this->Session->renew(), простое удаление может решить все ваши проблемы ... особенно, если он вызывает session_regenerate_id() под капотом.

Я бы предложил убрать перенаправление и посмотреть, если это все еще проблема. Если это так, то вы можете игнорировать все, что я сказал. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...