2008-11-21 9 views
9

mam ekran logowania, że ​​życie się ssl, więc tak: https://www.foobar.com/login następnie po ich zalogować, dostają przeniesione do głównej: https://www.foobar.com/dashbaordSesja nie oszczędzając przy przenoszeniu z SSL do non-SSL

Jednakże chcę, aby przenieść ludzi off z SSL po zalogowaniu się (aby zaoszczędzić CPU), więc tylko po sprawdzeniu, że są one w rzeczywistości zalogowany na https://www.foobar.com/dashbaord przenieść je do http://www.foobar.com/dashbaord

Cóż to zawsze wydaje się wymazać zmienne sesji, ponieważ po ponownym uruchomieniu strony potwierdzi, że są zalogowane (jako wszystkie strony nie) i sesja wydaje się nie istnieć, więc przenosi je na ekran logowania.

oddness/Wyniki:

  1. Wykaz egzemplarzy
  2. Drugi logowanie zawsze działa i szczęśliwie ją mi http://www.foobar.com/dashbaord
  3. powodzeniem tworzy plik cookie pierwsze logowanie
  4. Gdybym zalogować dwukrotnie, następnie wyloguj się i zaloguj ponownie, nie potrzebuję dwóch loginów (wydaje mi się, że wywnioskowałem to z faktu, że plik cookie istnieje). Jeśli usunę plik cookie, wrócę do dwóch loginów.
  5. Po drugim logowaniu mogę przejść z non-ssl z ssl, a sesja będzie się powtarzać.
  6. Przy pierwszym logowaniu przeniesienie do witryny innej niż ssl powoduje całkowitą likwidację sesji, ręczne przejście z powrotem do strony ssl nadal zmusza mnie do ponownego zalogowania.
  7. Drugi logowanie stosując dokładnie taki sam mechanizm jak pierwszy, przez SSL

Co próbowałem:

  1. Odtwarzanie z ustawieniami dotyczącymi security.level ciasto i session.checkagent - nic
  2. Mając ciastko przechowuj sesje w db (w przeciwieństwie do systemu plików) - nic
  3. Testowanie w FF, IE, Chrome na maszynie XP.

Czuję, że to coś związanego z tworzonym ciasteczkiem, ale nie czytającym.

Środowisko: 1. Debian 2. Apache 2 3. Mysql 4 4. PHP 5 5. CakePHP 6. Sesje są zapisywane domyślnym PHP, jak pliki

+0

OK, myliłem się co do tego nie wpływając na IE. Nie wyczyściłem poprawnie pamięci podręcznej w IE. – Justin

+0

Zobacz także: http://stackoverflow.com/questions/7969719/cakephp-cookie-session-problems –

Odpowiedz

4

Wymyśliłem to. Cake zmieniał wartość sessionIcookie_secure session in-the-loc podczas automatycznego połączenia SSL, więc tworzony cookie był bezpiecznym plikiem cookie, którego nie rozpoznałaby druga strona.

Solution, wykomentuj linia /cake/lib/session.php 420 ish:

ini_set ('session.cookie_secure', 1);

(Wystarczy sprawdzić, że aby znaleźć to, jak jestem pewien, że linia # zmieni się komunikaty wyjdzie.)

+1

Jeśli nie chcesz edytować plików podstawowych, możesz zrobić coś przeciwnego, zawsze zabezpiecz ciasteczko. Po prostu dodaj '$ this-> Cookie-> secure = true;' to beforeFilter in app_controller.php – shennyg

+2

Słodka wskazówka. Będąc w Drupal od lat, dostaję zimne poty, kiedy widzę rdzenny hack. – Justin

+0

@Justin Jest rok 2013 i wciąż pocę się od 2011 roku – iDev247

3

przede wszystkim zrobić Rozumiem poprawnie, że drugie logowanie używa tego samego mechanizmu co pierwszy (przez HTTPS)?

Czy pierwsze trafienie na niezabezpieczonej stronie tworzy nową sesję oprócz tej utworzonej podczas logowania?

Sprawdź, czy przy pierwszym logowaniu plik cookie nie jest ustawiony z flagą Secure (oznacza to, że plik cookie powinien być wysyłany tylko przez zabezpieczone połączenie (HTTPS)).

+0

Zaktualizowałem moje pytanie, aby potwierdzić komentarz 1. Komentarz 3, sprawdziłem, czy. Plik cookie nie jest zabezpieczony. Komentarz 2: Nie jestem pewien, ale zmywa sesję, która istniała (przez chwilę) po stronie ssl. – Justin

+0

Miałeś rację! Pozwól mi wyjaśnić: Ciasto było przełączanie sessioniCookie_secure ini wartość w locie podczas połączenia SSL automatycznie. Rozwiązanie, komentarz out/ciastko/lib /session.php linia 420 ish: > ini_set ('session.cookie_secure', 1); – Justin

+0

Nie jestem pewien, jaka jest tutaj etykieta odpowiedzi. Ten komentarz doprowadził mnie do rozwiązania i identyfikuje przyczynę. Jednak dla przyszłych użytkowników zamieściłem poniżej pełną odpowiedź. Aby być uczciwym, zaznaczyłem to jako odpowiedź, ale oddałem głos w jego odpowiedzi, ponieważ doprowadziło to do rozwiązania. – Justin

0

Czy Twoja strona główna ma na swoim urządzeniu flash, który powoduje kolejne żądanie do serwera? Lub jakiekolwiek ładowanie treści Ajaxem?

Czy sprawdziłeś nagłówki wysyłane z serwera? W IE możesz użyć Fiddlera lub w Firefoksie użyj dodatku Live Headers. Sprawdź, czy ustawione są nowe pliki cookie lub plik cookie CAKEPHP o innej wartości.

+0

Właśnie użyłem nagłówków na żywo i ustawia plik cookie tuż przed przeniesieniem użytkownika z powrotem na ekran logowania. Przy drugim logowaniu, które działa, nie ma żadnych dodatkowych plików cookie. Dziwny. – Justin

0

prostu wpadł na ten problem, ja skomentował
ini_set ("sesji. name ', Configure :: read (' Session.cookie '));
from session.php (/ ciastko/lib /session.php, linia 480 ~) i działało dobrze.

1

Możesz określić własne ustawienia obsługi sesji w pliku konfiguracyjnym (zamiast edytować plik biblioteki CakePHP). W pliku konfiguracyjnym możesz ustawić session.cookie_secure na 0, co ma pierwszeństwo przed ustawieniem/cake/lib/session.php. Umożliwi to użycie pliku cookie sesji dla połączeń SSL i innych niż SSL.

Oto notka na temat: http://bakery.cakephp.org/articles/view/how-to-bend-cakephp-s-session-handling-to-your-needs

oraz dokumentacji z Cookbook: http://book.cakephp.org/view/173/Sessions

4

Choć przyjął odpowiedź spełnia pragnienie PO, aby „przenieść ludzi off z SSL Po zalogowaniu "- jest to strasznie niebezpieczne, ponieważ naraża sesję użytkownika na porwanie (zobacz Ognik w celu łatwego wykorzystania).

Lepszy kompromis pomiędzy domyślnym zachowaniem CakePHP (wymagającym obsługi wszystkich stron SSL po uwierzytelnieniu użytkownika przez SSL) a akceptowaną odpowiedzią (która obsługuje wszystkie uwierzytelnione strony niezaszyfrowane i ujawnia uwierzytelniony plik cookie) ma służyć stronom szyfrowane przez SSL tylko wtedy, gdy wymagają uwierzytelnienia.

Łatwym sposobem na osiągnięcie tego celu jest zachowanie dwóch plików cookie sesji - jednego obsługiwanego w bezpieczny sposób i zawierającego informacje uwierzytelniające oraz innego, który jest podawany niezabezpieczony. Prosta implementacja do wspierania takiego podejścia podwójnego sesji użyje session_handler przesłonić session.name tak:

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

jeden element, aby pamiętać o tym podejściu jest to, że na link z non-SSL stronie bezpośrednio do strony wymagającej uwierzytelnienia będzie wymagać jawnego łączenia za pomocą https - ponieważ musisz wysłać sesyjny plik cookie zawierający informacje uwierzytelniające, a przeglądarka zrobi to tylko, jeśli link jest zaszyfrowany.

+0

Po pierwsze, przeglądam dokumenty Cake, aby przeczytać więcej o domyślnym zachowaniu wszystkich stron, które mają być obsługiwane SSL po uwierzytelnieniu SSL i nie mogę go znaleźć, czy ktoś może dostarczyć link? Po drugie, nie udało mi się uzyskać dla mnie dwóch plików cookie sesji. Z tym trochę kodu w moim beforeFilter nie byłem w stanie się zalogować. Jeśli to możliwe, chciałbym podawać moje strony bez protokołu SSL zalogowanemu użytkownikowi (tj. Nie wylogowując się), nie ujawniając krytycznych danych (ponownie, jeśli to możliwe). – Kris

1

można przeczytać w dokumentacji CakePHP w http://book.cakephp.org/2.0/en/development/sessions.html domyślne CakePHP do ustawiania session.cookie_secure true, gdy aplikacja jest na protokole SSL. Jeśli aplikacja obsługuje zarówno protokoły SSL, jak i nie-SSL, mogą wystąpić problemy z utratą sesji.Jeśli potrzebujesz dostępu do sesji na obu domenach SSL i nie-SSL będzie chciał wyłączyć to:

otwarciu pliku config/core.php i dodać jako mieszek

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

Teraz można przełączyć http i https, które nie tracą sesji :)

+0

Miałem do czynienia z tym samym problemem. Dodałem "session.cookie_secure" => false i problem został rozwiązany. Po prostu chcesz wiedzieć, czy jest wystarczająco bezpieczny, aby użyć session.cookie_secure = false? –

Powiązane problemy