Сессия не сохраняется при переходе с ssl на non-ssl - PullRequest
9 голосов
/ 21 ноября 2008

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

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

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

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

  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 ]

4 голосов
/ 21 ноября 2010

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

4 голосов
/ 08 декабря 2008

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

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

ini_set ('session.cookie_secure', 1);

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

3 голосов
/ 21 ноября 2008

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

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

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

1 голос
/ 15 августа 2013

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

1 голос
/ 05 февраля 2010

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

0 голосов
/ 28 января 2010

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

0 голосов
/ 21 ноября 2008

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

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

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