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

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

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

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

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

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

Что я пробовал:

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

Поэтому я чувствую, что это что-то связанное с созданием куки, но не с чтением.

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

7 ответов

Решение

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

Решение, закомментируйте /cake/lib/session.php строку 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 флаг (это означает, что куки должны отправляться только через защищенное (HTTPS) соединение).

Вы можете указать свои собственные параметры обработки сеанса в файле конфигурации (а не редактировать файл библиотеки CakePHP.) В файле конфигурации вы можете установить для session.cookie_secure значение 0, которое будет иметь приоритет над параметром в / cake / lib / session. PHP. Это позволит использовать куки-файл сеанса как для соединений 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, чтобы не потерять сессию:)

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

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

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

Другие вопросы по тегам