Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sesje
Forum PHP.pl > Forum > PHP
hawk
Parę trudnych (dla mnie winksmiley.jpg ) pytań z zakresu wbudowanych w php sesji:

1) Można się jakoś dowiedzieć, czy sesja jest nowa (świeżo założona), prościej i lepiej niż coś mniej więcej takiego (fuj, co za potworek!):
  1. <?php
  2. $isNew = ! (ini_get('session.use_cookies') && isset($_COOKIE[session_name()])) || (!ini_get('session.use_only_cookies') && (isset($_POST[session_name()]) || isset($_GET[session_name()])));
  3. ?>


2) Można jakoś skutecznie zniszczyć sesję? Nie usunąć wszystkie zmienne z sesji - session_unset(). Tylko rozwalić samą sesję. Znalazłem coś takiego:
  1. <?php
  2.  $CookieInfo = session_get_cookie_params();
  3.  if ( (empty($CookieInfo['domain'])) && (empty($CookieInfo['secure'])) ) {
  4.  setcookie(session_name(), '', time()-3600, $CookieInfo['path']);
  5.  } elseif (empty($CookieInfo['secure'])) {
  6.  setcookie(session_name(), '', time()-3600, $CookieInfo['path'], $CookieInfo['domain']);
  7.  } else {
  8.  setcookie(session_name(), '', time()-3600, $CookieInfo['path'], $CookieInfo['domain'], $CookieInfo['secure']);
  9.  }
  10.  unset($_COOKIE[session_name()]);
  11. ?>

Chociaż nie wiem, co tak naprawdę robi session_destroy(). Jeżeli nie usuwa pliku z sesją, to przy następnym żądaniu wystarczy podać SID w cookie lub w URLu i znowu mamy starą sesję (choć pewnie pustą).

3) Jak w sposób pewny i skuteczny wygenerować nowy SID dla istniejącej sesji. Co prawda jest funkcja session_regenerate_id(), która nawet wysyła nowe ciastko, ale...
- co się dzieje ze starym plikiem sesji? bo zakładam że tworzony jest nowy
- co się dzieje ze starym cookie?
Znowu, oczekiwałbym, że bo wygenerowaniu nowego SIDa starej sesji w ogóle i nieodwracalnie nie ma.
Arrow
no jesli chodzi o usuwanie to wziete zywcem z php.net

  1. <?php
  2.  
  3. // Inicjalizuj sesję
  4. // Jeśli używasz sesion_name(\"cośtam\"), nie zapomnij o tym teraz!
  5. // Usuń wszystkie zmienne sesyjne
  6. // Na koniec, zniszcz sesję
  7.  
  8. ?>


Opis sesji
hawk
aaevil.gif
Wbrew pozorom manual już dawno przeczytałem, tylko on w sumie nic nie daje. Co wg ciebie robi session_destroy() ? Co z tego że sesja już nie istnieje w tym skrypcie? Równie dobrze mogę sobie zrobić unset($_SESSION) i też nie ma już sesji.

A jak ktoś ponownie wejdzie na stronę z tym samym cookie, to będzie to ta sama sesja, czy nie? To właśnie rozumiem przez zniszczenie sesji - jak nie ma, to nie ma i już. I jesteśmy znowu w punkcie wyjścia sad.gif.
bregovic
Może to chamski sposób, ale możesz napisać własnego session handlera, i w ten sposób być pewnym tego co dzieje się z plikami tmp - no i wtedy możesz sprawdzać filemtime i inne fajne żeczy... AFAIK lepiej chyba zawsze pisać własnego handlera, jeśli w grę wchodzi bezpieczeństwo i stabilność sesji.
Chewolf
Cytat
session_register(); // rejestrowanie
session_unregister(); //wyrejestrowanie zmiennej
session_is_registered() w warunku if sprawdzane zostaje czy zmiena jest zarejestrowana
!session_is_registered() w warunku if sprawdzane zostaje czy zmiena nie jest zarejestrowana

tu jest ładnie opisane : no to CHop
sf
Jeżeli damy unset($SESSION .. to niszczymy dane zapisane na serwerze. Zrobiłem przed chwilą test i zauważyłem, że po akcji usunięcia sesjii plik nie jest usuwany, ale czyszczony. Czyli nic nie zawiera. Nawet jeżeli przez url wyślemy ponownie ten sam SID to i tak się nie zalogujemy bo musimy od nowa wprowadzić dane sesyjne, a robi to przecież nasz skrypt gdy wyślemy nasz login i hasło. Nie wiem co mają do tego cookie winksmiley.jpg

Acha, zauważyłem też, że jeżeli po wylogwaniu, a następnie ponownym zalogowaniu, zmienne sesyjne zapiszą się ponownie do pliku,w którym wcześniej były nasze dane.
hawk
@m5910: session_register() i tak nie powinno się używać z $_SESSION, a że $_SESSION jest zalecane, więc session_register() nie powinno się w ogóle używać. Podobnie reszta podanych funkcji.

@sf: no właśnie, plik zostaje. Trochę szkoda, bo przy następnym wejściu wszelkie znaki na niebie i ziemii będą wskazywać, że mamy do czynienia z kontynuacją sesji - bo mamy - chociaż tak naprawdę to chciałbym np. mieć już całkiem nową.

Co do $_SESSION, to jest bardzo dziwny zwierz winksmiley.jpg. Też zrobiłem trochę testów i wyszło że magiczna jest sama nazwa $_SESSION. Bo:
1) przed session_start isset($_SESSION) == false
2) po session_start można zrobić unset($_SESSION) i... sesji nie ma, oczywiście, ale...
3) kawałek dalej można zrobić $_SESSION = array('foo'=>'bar') i sesja znowu jest, i...
4) co najśmieszniejsze, jak stworzę sobie nową zmienną o nazwie $_SESSION, to jest to znowu super-global, czyli - jak pisałem - sama nazwa jest magiczna.
tahat
Cytat(hawk @ 2004-11-29 20:57:29)
Chociaż nie wiem, co tak naprawdę robi session_destroy(). Jeżeli nie usuwa pliku z sesją, to przy następnym żądaniu wystarczy podać SID w cookie lub w URLu i znowu mamy starą sesję (choć pewnie pustą).

Poobserwuj jak sie zachowuja pliki w katalogu sessions przy wywolywaniu konkretnych funkcji.

Ponizszy kod calkowicie usuwa plik sesji:
  1. <?php
  2. unset($_SESSION['login_setup']);
  3. header (&#092;"Location: ./?logout=ok\");
  4. ?>
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.