У меня есть экран входа в систему, который я заставляю использовать ssl, вот так: https://www.foobar.com/login затем после входа в систему они перемещаются на домашнюю страницу: https://www.foobar.com/dashbaord
Однако я хочу убрать людей с SSL после входа в систему (для экономии ЦП), поэтому сразу после проверки того, что они действительно вошли в систему на https://www.foobar.com/dashbaord, я перемещаю их в http://www.foobar.com/dashbaord
Что ж, это всегда, кажется, стирает переменные сеанса, потому что, когда страница запускается снова, это подтверждает, что они вошли в систему (как и все страницы), и сеанс не существует, поэтому он перемещает их на экран входа в систему.
Странность / выводы:
Что я пробовал:
Поэтому я чувствую, что это связано с тем, что файл cookie создается, но не читается.
Среда: 1. Debian 2. Apache 2 3. MySQL 4 4. PHP 5 5. CakePHP 6. Сеансы сохраняются по умолчанию PHP в виде файлов.
См. Также: stackoverflow.com/questions/7969719/…






Прежде всего, правильно ли я понимаю, что второй логин использует тот же механизм, что и первый (через HTTPS)?
Создает ли первое обращение к незащищенной странице новый сеанс в дополнение к сеансу, созданному при входе в систему?
Убедитесь, что при первом входе в систему cookie не установлен с флагом Secure (это означает, что cookie следует отправлять только через защищенное (HTTPS) соединение).
Обновил мой вопрос, чтобы подтвердить комментарий 1. Комментарий 3, проверил. Файл cookie не настроен на безопасность. Комментарий 2: Не уверен, но он уничтожает сеанс, который существовал (на мгновение) на стороне ssl.
Ты был прав! Позвольте мне уточнить: Cake автоматически переключал ini-значение session.cookie_secure, находясь под SSL-соединениями. Решение, закомментируйте /cake/lib/session.php строку 420 ish:> ini_set ('session.cookie_secure', 1);
Я не уверен, каков этикет для ответа здесь. Этот комментарий привел меня к решению и действительно указывает на причину. Однако для будущих пользователей я опубликовал полный ответ ниже. Честно говоря, я отметил это как ответ, но проголосовал за его ответ, поскольку он действительно привел к решению.
Есть ли на вашей домашней странице вспышка, которая делает последующий запрос к вашему серверу? Или какая-то загрузка контента Ajax?
Вы проверяли, что заголовки отправляются с сервера? В IE вы можете использовать Fiddler или в Firefox использовать надстройку Live Headers. Проверьте, не устанавливаются ли новые файлы cookie или файл cookie CAKEPHP имеет другое значение.
Я просто использовал живые заголовки, и он устанавливает файл cookie непосредственно перед тем, как вернуть пользователя на экран входа в систему. При втором входе в систему, который работает, дополнительные файлы cookie не устанавливаются. Странный.
Я понял это. 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
Сладкий совет. Находясь на земле Drupal в течение многих лет, у меня холодный пот, когда я вижу базовый хак.
@Justin Это 2013 год, а я все еще потею с 2011 года
Только что столкнулся с этой проблемой, я прокомментировал следующее, и все сработало:
<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 для вошедшего в систему пользователя (т. Е. Без выхода из системы), не раскрывая при этом важные данные (опять же, если возможно).
Вы можете прочитать больше в документации 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?
@ elegance-user я думаю, что мы не должны хранить информацию о пользователе или важную информацию в cookie, а хранить только ту информацию, которая не требует защиты.
Хорошо, я ошибался, говоря, что это не влияет на IE. Я неправильно очищал кеш в IE.