Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sesja po wyłączeniu przeglądarki
Forum PHP.pl > Forum > Przedszkole
Wieviór
Co zrobić, by sesja trwała nawet po wyłączeniu przeglądarki?
batman
Ustawić ciasteczko

setcookie
Wieviór
  1. <?
  2. $czas = 3600 * 24 * 30;
  3. setcookie ('sesja', $czas);
  4. ?>


To dobrze? Bo nie wiem, a nie działa... :/
batman
  1. <?php
  2. $czas = 3600 * 24 * 30;
  3. $wartosc_ciastka = 1; // tutaj zapisujesz wartosc ciastka, cokolwiek dusza zapragnie ;) 
  4. setcookie ('sesja', $wartosc_ciastka, $czas);
  5. ?>
PiotrLegnica
3 parametr setcookie to nie czas życia ciastka, tylko data wygaśnięcia w postaci timestampu (3600*24*30 == 2592000 == 31-01-1970, 01:00:00).
Powinno być, np.
  1. <?php
  2. setcookie('sesja', 'wartość', strtotime('+30 days'));
  3. ?>
Wieviór
Efektem Twojego przykładu będzie to, że ciastko będzie działało przez 30 dni?

  1. <?
  2. $wartosc_ciastka = 1;
  3. setcookie ('sesja', $wartosc_ciastka, strtotime('+30 days'));
  4. ?>


Bo to jakoś mi nie działa, wyłączam przeglądarkę, i dane zapisane w sesji znikają.
batman
A co zapisujesz do ciastka? Jeśli 1, to po zamknięciu przeglądarki i ponownym jej otwarciu w ciastku będzie 1. Czyli działa.

Może inaczej. Co chcesz, by było zapisane w ciastku? To, że użytkownik jest zalogowany, ustawienia użytkownika (np. motyw graficzny), czy jeszcze coś innego?
Wieviór
aaa, to mi nie o to chodziło chyba...

Ciastka z sesją się łączą? Chodzi mi o to, co zrobić, żeby jakaś wartość przypisana do $_SESSION['costam'] była jeszcze "widoczna" po wyłączeniu i włączeniu przeglądarki.
batman
Teoretycznie sesja bazuje na ciastkach, ale w praktyce sprawia to zawsze dużo problemów. Jeśli chcesz przypisać do ciastka jakąś zmienną sesyjną możesz to zrobić w taki sposób (czas "życia" ciastka sam ustawisz winksmiley.jpg )

  1. <?php
  2. $_SESSION['jakas_zmienna'] = 'jakas_wartosc_zmiennej';
  3. setcookie('moje_ciacho', $_SESSION['jakas_zmienna']);
  4. ?>
PiotrLegnica
Można też własny handler sesji napisać (i np. do bazy zapisywać [ciastka mają ograniczoną pojemność]).
session_set_save_handler()
Wieviór
Ok, ręce mi opadają:

Mam plik index.php, którego zawartość w skrócie wygląda tak:

  1. <?
  2. setcookie('moje_ciacho', $_SESSION['loginek'], strtotime('+30 days'));
  3. setcookie('moje_ciacho', $_SESSION['layout'], strtotime('+30 days'));
  4. setcookie('moje_ciacho', $_SESSION['uid'], strtotime('+30 days'));
  5. if (isset ($_SESSION['loginek']))
  6. {
  7. // wybrany lay
  8. $layout = $_SESSION['layout'];
  9. $pokaz = 'layout'.$layout.'.php';
  10. include $pokaz;
  11. }
  12. else
  13. {
  14. // domyślny lay
  15. $_SESSION['layout'] = '1';
  16. $layout = $_SESSION['layout'];
  17. $pokaz = 'layout'.$layout.'.php';
  18. include $pokaz;
  19. }
  20. ?>


Plik layout1.php (to zarazem domyślny i wybrany), który includuje w sobie login.php, który wygląda tak:

  1. <?
  2. if (!isset ($_SESSION['loginek']))
  3. {
  4. if (!isset ($_POST['logowanie']))
  5. {
  6. echo '<form></form>';
  7. } else {
  8. if (!empty ($_POST['login']) AND !empty ($_POST['haslo']))
  9. {
  10. // łączenie do bazy
  11. if ($bazalogin['haslo'] == $_POST['haslo'] AND $bazalogin['level'] >= '1')
  12. {
  13. echo 'Zalogowano pomyślnie!';
  14. $_SESSION['loginek'] = $bazalogin['login'];
  15. $_SESSION['layout'] = $bazalogin['layout'];
  16. $_SESSION['uid'] = $bazalogin['id'];
  17. ?><script>setTimeout('document.location = "index.php"', 1000);</script><?
  18. } else {
  19. echo 'Podano nieprawiłowe dane!';
  20. }
  21. }
  22. }
  23. } else {
  24. echo '<b>Witaj</b>';
  25. }
  26. ?>


No i co ja tu jeszcze robię źle, że jak się zaloguję, po czym wyłączę i włączę przeglądarkę, to jestem wylogowany?
batman
@PiotrLegnica
Możliwe, że się mylę, ale ciastka nie mają ograniczonej "pojemności". Jedyne co je ogranicza, to szybkość łącza (w końcu trzeba je wysłać od klienta na serwer).
mike
~Wieviór proszę poprawić tytuł o znacznik zgodnie z zasadami forum Przedszkole:
Temat: Tematyka i zasady panujace na forum Przedszkole
Już drugi raz o tym zapominasz.
WereWolf
Cytat(batman @ 16.12.2006, 20:07:34 ) *
Teoretycznie sesja bazuje na ciastkach, ale w praktyce sprawia to zawsze dużo problemów. Jeśli chcesz przypisać do ciastka jakąś zmienną sesyjną możesz to zrobić w taki sposób (czas "życia" ciastka sam ustawisz winksmiley.jpg )

niezupełnie...

sesja nie bazuje na ciastkach, sesja jest zapisywana tylko po stronie serwera, w ciastkach (ewentualnie przekazywany przez adresy url) jest zapisywany tylko identyfikator sesji...

i tu się pojawia problem, bo co z tego, że w ciastku zostawimy informacje o identyfikatorze sesji, jak sesja na serwerze dawno już wygaśnie...

nie jestem pewien, ale być może pomogłoby ustawienie zmiennej session.gc_maxlifetime na wyższą wartość... ale na pewno nie da się tego ustawić na "nieskończoność"

rozwiązaniem mogłoby być też ustawienie swojego katalogu do przechowywania danych sesji (jeśli działamy na serwerze współdzielonym), ale jak ktoś wcześnie wspomniał, utworzenie swojego handlera sesji i zapisywanie danych sesji np. w bazie


a jeśli chodzi o ustawianie ciasteczek sesji, to raczej lepszym wyjściem byłoby skorzystanie z session_set_cookie_params, a nie z samego setcookie (przynajmniej jeśli chodzi o ustawienie ciasteczek bezpośrednio dla id sesji)
batman
@WereWolf
Napisałem teoretycznie, ponieważ nie jest to temat o ciastkach, lecz o zachowaniu sesji po stronie użytkownika. Tutaj masz informacje w jaki sposób sesje są przechowywane sesje.

Cytat
Istnieją dwie metody propagacji identyfikatora sesji:
- Ciasteczka
- Parametry URL'a


@Wieviór
Twój kod ni działa, ponieważ nigdzie nie sprawdzasz czy ciastka istnieją. Zawsze pokazuje się tekst Witaj lub formularz logowania. Sprawdzasz czy istnieje zmienna sesyjna, która jest pusta. Nie przypisałeś do niej wartości ciastka ($_COOKIE). Zamiast sprawdzać zmienną $_SESSION, sprawdzaj zmienna $_COOKIE. Pamiętaj o walidacji tych zmiennych, ponieważ można je "podrobić".
WereWolf
Cytat(batman @ 17.12.2006, 10:09:43 ) *
@WereWolf
Napisałem teoretycznie, ponieważ nie jest to temat o ciastkach, lecz o zachowaniu sesji po stronie użytkownika.

no właśnie ja zrozumiałem to inaczej...
myślałem, że autorowi tematu chodziło tylko o zachowanie sesji na serwerze nawet jeśli użytkownik zamknie stronę, a nie o zachowanie danych po stronie przeglądarki... ale faktycznie chyba jedyne rozwiązanie to zapisanie jej danych bezpośrednio u użytkownika - co raczej nie jest zbyt bezpieczne
batman
Cytat
myślałem, że autorowi tematu chodziło tylko o zachowanie sesji na serwerze nawet jeśli użytkownik zamknie stronę


Jakoś nie potrafię sobie wyobrazić w jaki sposób działa zapamiętywanie sesji po stronie serwera winksmiley.jpg
Do takich rzeczy stosuje się bazy danych lub pliki, ale to już inna historia.

Jeśli chodzi o bezpieczeństwo, to się z Tobą zgodzę. Zapamiętywanie w ciastku, czy jest ktoś zalogowany, czy nie to nie jest najlepszy pomysł. Pamiętaj - największym Twoim wrogiem jest użytkownik. Nie możesz zakładać, że jest on świadomym użytkownikiem internetu. Pisane aplikacje muszą być idiotoodporne.
WereWolf
Cytat(batman @ 17.12.2006, 19:33:01 ) *
Jakoś nie potrafię sobie wyobrazić w jaki sposób działa zapamiętywanie sesji po stronie serwera winksmiley.jpg
Do takich rzeczy stosuje się bazy danych lub pliki, ale to już inna historia.

niezbyt precyzyjnie się wyraziłem...

po prostu wiem, że dane odnośnie sesji nie są zapisywane po stronie usera, tylko na serwerze (przez pliki - zazwyczaj w tmp, albo w bazie, zależnie od ustawień)... w każdym razie - z tego co zrozumiałem chodziło o to, żeby sesja nie wygasała, a co za tym idzie, jej dane nadal były zapisane na serwerze... ale jak już mówiłem, tak się raczej nie da i pozostaje sposób, o którym była mowa smile.gif


chociaż... tak sobie myślę, że jeśli by skorzystać z własnych handlerów sesji, to w sumie można by ten problem obejść, pod warunkiem, że dane sesji zostawałyby w bazie "na wieki", a po stronie użytkownika nadal był zapisywany tylko identyfikator sesji (co nadal nie jest zbyt bezpieczne)

tu pojawia się jeden problem... takie rozwiązanie przy większej liczbie użytkowników bardzo szybko powiększyłoby bazę z danymi sesji...
batman
Cytat
chociaż... tak sobie myślę, że jeśli by skorzystać z własnych handlerów sesji, to w sumie można by ten problem obejść, pod warunkiem, że dane sesji zostawałyby w bazie "na wieki"

Dane sesji nie muszą pozostawać w bazie na wieki. Wystarczy ustawić czas wygaśnięcia sesji na jakiś czas, a następnie skrypt w cronie mieliłby bazę i wywalał nieaktualne sesje.

Cytat
tu pojawia się jeden problem... takie rozwiązanie przy większej liczbie użytkowników bardzo szybko powiększyłoby bazę z danymi sesji...

Nie powiększyłoby, ponieważ każdy użytkownik miałby jeden wiesz w tabeli przechowującej sesje. W momencie tworzenia nowej sesji, stara byłaby usuwana.

Cytat
...(co nadal nie jest zbyt bezpieczne)

Są bardzo dobre sposoby zapewnienia bezpieczeństwa takich sesji ("ciastkowych" również). Nie zapewniają 100% skuteczności, jednak dzięki nim można zabezpieczyć sesje przed przejęciem przez innego użytkownika.

Nie ma jednak sensu by rozwodzić się nad sesjami trzymanymi w bazie danych. Najprostszym rozwiązaniem problemu @Wieviór-a są ciastka.
WereWolf
Cytat(batman @ 17.12.2006, 20:36:52 ) *
Dane sesji nie muszą pozostawać w bazie na wieki. Wystarczy ustawić czas wygaśnięcia sesji na jakiś czas, a następnie skrypt w cronie mieliłby bazę i wywalał nieaktualne sesje.
Nie powiększyłoby, ponieważ każdy użytkownik miałby jeden wiesz w tabeli przechowującej sesje. W momencie tworzenia nowej sesji, stara byłaby usuwana.

w normalnym przypadku tak... ale rozpatruję tu rozwiązanie pytania, które było w pierwszym poście - czyli, żeby sesja trwała "nieskończenie długo", w takim przypadku właśnie dane sesji musiałyby być zachowywane przez cały czas

no ale starczy... bo chyba trochę odeszliśmy od tematu smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.