2013-01-31 8 views
14

W jaki sposób można sprawdzić poprawność pliku cookie?
Grać w ramy, jak działają sesje i pliki cookie?

  • Zauważyłem, że po ponownym uruchomieniu serwera nadal był zalogowany chociaż nie presist żadnych danych sesji w bazie danych.
  • Zauważyłem również że mogę ustawić datę na serwerze być większa, że ​​exipry data cookie i nadal byłem zalogowany.
  • I wylogować (zapisany plik cookie do tekstu plik) i przeglądarka zgubiła plik cookie. Następnie I odtworzyłem plik cookie z pliku tekstowego i zostałem ponownie zalogowany.

cookie wygląda następująco:

PLAY_SESSION = e6443c88da7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-userid% 3A1

// My logout code 
def logout() = Action { 
    Ok("").withNewSession 
} 

From the documentation
Odrzucanie całą sesję
Istnieje specjalna operacja, która odrzuca cała sesja:

Ok("Bye").withNewSession 

Odpowiedz

5

Uważam, że odpowiedź na czytanie the documentation jest uważniejsza i łączy różne części.

Nie ma technicznego limitu czasu na sesję. Wygasa, gdy użytkownik zamyka przeglądarkę internetową. Jeśli potrzebujesz funkcjonalnego limitu czasu dla konkretnej aplikacji, po prostu przechowuj znacznik czasu w sesji użytkownika i używaj go, jakkolwiek potrzebuje twoja aplikacja (np. Dla maksymalnej sesji, czas trwania, maksymalny czas nieaktywności, itd.).


Ważne jest, aby zrozumieć, że dane sesji i Flash nie są przechowywanych przez serwer ale dodawane są do każdego kolejnego żądania HTTP, użyciu mechanizmu cookies. Oznacza to, że rozmiar danych jest bardzo ograniczony (do 4 KB) i można przechowywać tylko wartości ciągów.


Więc to było to, czego obawiali się, że jeśli cookies zgubić ktoś może zalogować się na serwerze dla wszystkich przyszłych.

Co muszę zrobić, aby zabezpieczyć to, aby dodać self-made autoryzacji datownika (zapisać znacznik czasu w pliku cookie i zatwierdź stronie sever)

+0

"jeśli ciasteczko się zgubi, każdy może zalogować się na serwer na całą przyszłość", co to może oznaczać? Jeśli nie ma plików cookie, nie ma dostępu, to wszystko po stronie klienta, Play po prostu zapewnia, że ​​sam plik (podpisany) nie został naruszony. – virtualeyes

+1

Nie myśl o zagubieniu jako próżni, ale o zbłąkanym. – Farmor

+1

W przyszłości, proszę połączyć się z odpowiednimi dokumentami, aby umożliwić czytelnikom twoich odpowiedzi dalsze dochodzenie. – Cheeso

10

nie określono w jaki sposób uwierzytelniania użytkowników, więc zgadnij, że używasz prostej próbki, która jest ... prosta.

Używa identyfikatora użytkownika do identyfikacji użytkownika i sprawdza, czy podpisany plik cookie sesji nie został zmanipulowany, dlatego jeśli ponownie utworzysz plik cookie z prawidłowym podpisem, będzie on nadal ważny.

Powinieneś utworzyć obszar dla kluczy sesji po stronie serwera, tj. w DB lub w pamięci podręcznej (która będzie szybsza niż DB). Jego klucz powinien być generowany losowo (i zdecydowanie długotrwały) dla każdej udanej akcji logowania, a także powinien zawierać dane umożliwiające identyfikację użytkownika, datę wygaśnięcia itp. Następnie należy umieścić to losowe sess_key w sesji Play zamiast adresu e-mail zalogowanego użytkownika lub id z jego wiersza w DB, a po wylogowaniu i/lub dacie wygaśnięcia powinien zostać usunięty. W takim przypadku, nawet jeśli utracisz plik cookie po wylogowaniu, nie będzie możliwe prawidłowe zalogowanie się przy braku eskapowania sess_key.

AFAIR cache Standardowa pamięć zostanie oczyszczona przy każdym ponownym uruchomieniu aplikacji, aby upewnić się, że wszystko sess_keys z DB zostanie usunięty, a także można użyć Global object i obciąć tabelę w onStart(...) metody.

+0

Czy w tym momencie należy po prostu pozostać poza ekosystemem sesji Play (jeśli chodzi o uwierzytelnianie)? Zastanawiam się nad używaniem redis dla półtrwałej pamięci podręcznej, aby zarządzać identyfikatorami sesh i osobno korzystać z sesji Play do przechowywania danych sesji publicznej. Brzmi to jak dobry plan? –

Powiązane problemy