Сессия не сохраняется при переходе с ssl на не 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 существует). Если я удалю 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 в виде файлов.

Хорошо, я ошибался, говоря, что это не влияет на IE. Я неправильно очищал кеш в IE.

Justin 08.12.2008 20:09

См. Также: stackoverflow.com/questions/7969719/…

Jari Keinänen 08.11.2012 10:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
9
2
7 042
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

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

Обновил мой вопрос, чтобы подтвердить комментарий 1. Комментарий 3, проверил. Файл cookie не настроен на безопасность. Комментарий 2: Не уверен, но он уничтожает сеанс, который существовал (на мгновение) на стороне ssl.

Justin 21.11.2008 16:06

Ты был прав! Позвольте мне уточнить: Cake автоматически переключал ini-значение session.cookie_secure, находясь под SSL-соединениями. Решение, закомментируйте /cake/lib/session.php строку 420 ish:> ini_set ('session.cookie_secure', 1);

Justin 08.12.2008 20:25

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

Justin 19.01.2009 18:32

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

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

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

Justin 08.12.2008 19:27
Ответ принят как подходящий

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

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

ini_set('session.cookie_secure', 1);

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

Если вы не хотите редактировать основные файлы, вы можете сделать наоборот, всегда делайте cookie безопасным. Просто добавьте $this->Cookie->secure = true; в beforeFilter в app_controller.php

shennyg 29.04.2011 01:18

Сладкий совет. Находясь на земле Drupal в течение многих лет, у меня холодный пот, когда я вижу базовый хак.

Justin 04.05.2011 21:10

@Justin Это 2013 год, а я все еще потею с 2011 года

iDev247 03.10.2013 11:02

Только что столкнулся с этой проблемой, я прокомментировал следующее, и все сработало:

<br />ini_set('session.name', Configure::read('Session.cookie'));
<br />
from session.php (/cake/lib/session.php, line 480~)

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

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

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

Самый простой способ добиться этого - поддерживать два файла cookie сеанса: один защищен и хранит информацию для аутентификации, а другой - небезопасно. Простая реализация для поддержки такого подхода с двумя сеансами будет использовать 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 сеанса, содержащий информацию для аутентификации и браузер сделает это, только если ссылка зашифрована.

Во-первых, я просматриваю документы Cake, чтобы узнать больше о поведении по умолчанию всех страниц, которые будут обслуживаться SSL после аутентификации SSL, и не могу найти его, может ли кто-нибудь предоставить ссылку? Во-вторых, мне не удалось заставить работать два сеанса cookie. С этим фрагментом кода в моем beforeFilter мне не удалось войти в систему. Если возможно, я хотел бы обслуживать мои страницы без SSL для вошедшего в систему пользователя (т. Е. Без выхода из системы), не раскрывая при этом важные данные (опять же, если возможно).

Kris 04.01.2014 19:53

Вы можете прочитать больше в документации 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, чтобы не терять сессию :)

Я столкнулся с той же проблемой. Я добавил 'session.cookie_secure' => false, и проблема решена. Просто хочу знать, достаточно ли безопасно использовать session.cookie_secure = false?

elegant-user 21.12.2017 13:12

@ elegance-user я думаю, что мы не должны хранить информацию о пользователе или важную информацию в cookie, а хранить только ту информацию, которая не требует защиты.

Quy Le 21.03.2018 13:10

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