Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sesja po wyłączeniu przeglądarki, Jak?
-Wieviór-
post
Post #1





Goście







Co zrobić, by sesja trwała nawet po wyłączeniu przeglądarki?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 19)
batman
post
Post #2





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Ustawić ciasteczko

setcookie


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
-Wieviór-
post
Post #3





Goście







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


To dobrze? Bo nie wiem, a nie działa... :/
Go to the top of the page
+Quote Post
batman
post
Post #4





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




  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. ?>


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
PiotrLegnica
post
Post #5





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 6.07.2005
Skąd: Legnica

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował PiotrLegnica 16.12.2006, 19:37:07


--------------------
SithTemplate
Go to the top of the page
+Quote Post
-Wieviór-
post
Post #6





Goście







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ą.
Go to the top of the page
+Quote Post
batman
post
Post #7





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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?


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
-Wieviór-
post
Post #8





Goście







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.
Go to the top of the page
+Quote Post
batman
post
Post #9





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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. ?>


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
PiotrLegnica
post
Post #10





Grupa: Zarejestrowani
Postów: 71
Pomógł: 2
Dołączył: 6.07.2005
Skąd: Legnica

Ostrzeżenie: (0%)
-----


Można też własny handler sesji napisać (i np. do bazy zapisywać [ciastka mają ograniczoną pojemność]).
session_set_save_handler()


--------------------
SithTemplate
Go to the top of the page
+Quote Post
-Wieviór-
post
Post #11





Goście







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?
Go to the top of the page
+Quote Post
batman
post
Post #12





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




@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).


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
mike
post
Post #13





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


~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.
Go to the top of the page
+Quote Post
WereWolf
post
Post #14





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 21.05.2005

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
batman
post
Post #15





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




@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ć".


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
WereWolf
post
Post #16





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 21.05.2005

Ostrzeżenie: (0%)
-----


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

Ten post edytował WereWolf 17.12.2006, 11:12:46
Go to the top of the page
+Quote Post
batman
post
Post #17





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
WereWolf
post
Post #18





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 21.05.2005

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
batman
post
Post #19





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
WereWolf
post
Post #20





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 21.05.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 22:58