Сессия не сохраняется при переходе с ssl на non-ssl

У меня есть экран входа в систему, который я заставляю быть ssl, так вот: https://www.foobar.com/login, после того как они вошли в систему, они перейдут на главную страницу: https://www.foobar.com/dashbaord

Тем не менее, я хочу переместить людей из SSL после входа в систему (чтобы сохранить CPU), поэтому сразу после проверки того, что они действительно вошли в систему на https://www.foobar.com/dashbaord, я перемещаю их по адресу http: // www.foobar.com/dashbaord

Ну, это всегда, кажется, уничтожает переменные сеанса, потому что, когда страница запускается снова, она подтверждает, что они вошли в систему (как и все страницы), а сеанс не существует, поэтому он перемещает их на экран входа.

Нечетности / выводы:

  1. Элемент списка
  2. Второй логин всегда работает, и я счастливо добираюсь до http://www.foobar.com/dashbaord
  3. Он успешно создает cookie первый логин
  4. Если я дважды вхожу в логин, затем выхожу из системы и снова вхожу в систему, мне не нужны два входа (я, похоже, прослеживал это с тем, что файл cookie существует). Если я удалю файл cookie, я вернусь к двум логинам.
  5. После второго входа я могу перейти из не-ssl из ssl, и сеанс сохраняется.
  6. При первом входе в систему переход на сайт, отличный от ssl, полностью уничтожает сеанс, а возврат к сайту ssl по-прежнему заставляет меня снова войти в систему.
  7. Второй логин с использованием того же механизма, что и первый, поверх ssl

То, что я пробовал:

  1. Игра с настройками Cake для security.level и session.checkagent – ничего
  2. Имея торт, храните сеансы в db (в отличие от файловой системы) – ничего
  3. Тестирование в FF, IE, Chrome на компьютере XP.

Поэтому я чувствую, что это связано с созданием файла cookie, но не с чтением.

Окружающая среда: 1. Debian 2. Apache 2 3. Mysql 4 4. PHP 5 5. CakePHP 6. Сессии сохраняются по умолчанию PHP, как файлы

Я понял это. Cake переключал значение session.cookie_secure ini на лету, в то время как под SSL-соединениями автоматически, поэтому созданный файл cookie был безопасным файлом cookie, который вторая страница не распознала.

Решение, закомментируйте /cake/lib/session.php line 420 ish:

ini_set ('session.cookie_secure', 1);

(Просто найдите это, чтобы найти его, так как я уверен, что строка # будет меняться по мере выпуска релизов.)

Хотя принятый ответ отвечает желанию OP «переводить людей из SSL после входа в систему» ​​- это ужасно неуверенно в том, что он подвергает сеанс пользователя угону (см. Firesheep для легкого использования).

Лучший компромисс между поведением CakePHP по умолчанию (который требует, чтобы все страницы обслуживались SSL после аутентификации пользователя через SSL), и принятый ответ (который обслуживает все аутентифицированные страницы, незашифрованные и подверженные аутентифицированному файлу cookie) предназначен для обслуживания страниц, зашифрованных через SSL, если и только если они требуют аутентификации.

Легкий способ добиться этого – поддерживать два сеансовых куки – тот, который защищен и содержит информацию аутентификации, а другой – небезопасный. Простая реализация для поддержки такого подхода с двойной сессией будет использовать session_handler для переопределения имени session.name так:

  if (env('HTTPS')) { ini_set('session.name', Configure::read('Session.cookie').'-SECURE'); }else{ ini_set('session.name', Configure::read('Session.cookie')); } 

Один из пунктов, который следует учитывать при таком подходе, заключается в том, что для ссылки с не-SSL-страницы непосредственно на страницу, для которой требуется аутентификация, вам потребуется явно связать использование https – поскольку вам нужно будет отправить файл cookie сеанса, содержащий информацию об аутентификации и браузер будет делать это только в том случае, если ссылка зашифрована.

Прежде всего, правильно ли я понимаю, что второй логин использует тот же самый механизм, что и первый (через HTTPS)?

Создает ли первый случай на незащищенной странице новый сеанс, в дополнение к тому, который был создан во время входа?

Убедитесь, что при первом входе в систему cookie не установлен с флагом Secure (это означает, что cookie следует отправлять только через защищенное (HTTPS) соединение).

Вы можете указать собственные настройки обработки сеанса в файле конфигурации (а не редактировать файл библиотеки CakePHP.) В файле конфигурации вы можете установить session.cookie_secure в 0, что будет иметь приоритет над настройкой в ​​/ cake / lib / session. PHP. Это позволит использовать cookie сеанса как для SSL, так и для соединений, отличных от SSL.

Вот запись в блоге по теме: http://bakery.cakephp.org/articles/view/how-to-bend-cakephp-s-session-handling-to-your-needs

и некоторые документы из Поваренной книги: http://book.cakephp.org/view/173/Sessions

Вы можете прочитать больше в документации CakePHP по адресу http://book.cakephp.org/2.0/en/development/sessions.html. По умолчанию CakePHP устанавливает значение session.cookie_secure в true, когда ваше приложение работает по протоколу SSL. Если ваше приложение работает как с протоколами SSL, так и с протоколом, отличным от SSL, у вас могут возникнуть проблемы с потерями сеансов. Если вам нужен доступ к сеансу как для SSL, так и для доменов, не относящихся к SSL, вы должны отключить это:

Вы открываете файл Config / core.php и добавляете его ниже

 Configure::write('Session', array( 'defaults' => 'php', 'ini' => array( 'session.cookie_secure' => false ) )); 

Теперь вы можете переключать http и https, которые не теряют сеанс 🙂

Ваша домашняя страница получила флеш-память, которая делает последующий запрос на ваш сервер? Или любая загрузка содержимого Ajax?

Вы проверяли, что заголовки отправляются с сервера? В IE вы можете использовать Fiddler или Firefox, используя аддон Live Headers. Проверьте, установлены ли какие-либо новые файлы cookie или cookie CAKEPHP, имеющие другое значение.

просто столкнулся с этой проблемой, я прокомментировал
ini_set ('session.name', Configure :: read ('Session.cookie'));
from session.php (/cake/lib/session.php, строка 480 ~), и он работал нормально.