CompZone.Org :: Artykuły :: PHP
Jaki jest Twój wiek?
40 - 59
26 - 39
19 - 25
13 - 18
12 i mniej
60 i więcej
Sonda Wyniki

Add to Google

Rzut oka na sesje w PHP

Protokół HTTP został opracowany w celu prostej wymiany dokumentów. Nie przewidywał jednak możliwości tworzenia sesji, czyli pewnego mechanizmu zapisywania stanu (bez stanowość). Jednak rozwój internetu wymógł utworzenie takiej techniki.

Dzięki użyciu sesji możliwe stało się logowanie do serwisów czy przechowywanie pewnych informacji na dłużej niż odświeżenie strony.

Jak działają sesje?

Działanie sesji opisze w dużym skrócie i uproszczeniu. Na serwerze przechowywane są pewne informacje na temat każdej otwartej sesji oraz zmienne sesyjne. Każda sesja otrzymuje unikatowy identyfikator, który może być przechowywany w formie ciasteczka lub przekazywany w formie zmiennej SID typu GET, jeżeli użytkownik zablokował ciasteczka.

PHP a sesje

PHP udostępnia gamę funkcji umożliwiającą zarządzanie sesjami. Najważniejszą z nich jest chyba session_start, która służy do utworzenia sesji. Ta funkcja powinna być wywołana przed jakimkolwiek zapisaniem lub odczytaniem zmiennej sesyjnej.

Inną ważną funkcją jest niszczenie sesji, które niszczy wszystkie zmienne sesyjne i resetuje stan sesji. Funkcja ta session_destroy może posłużyć np. do stworzenia systemu wylogowywania.

Jak tworzyć, zapisywać i odczytywać zmienne. We wcześniejszych wersjach PHP istniały funkcje takie jak session_register czy session_is_registered, które umożliwiały odpowiednio tworzenie i sprawdzanie czy jest zarejestrowana zmienna sesyjna. W nowszych wersjach (> 4.0.6) zaleca się używanie zmiennej superglobalnej $_SESSION. Upraszcza to znacznie sprawę, dlatego że możemy traktować zmienne sesyjne prawie jak zwykłą tablicę.

start_session.php:

 <?php
session_start();
$_SESSION['nick'] = 'Kodie';
?>

show_variable.php:
<?php
session_start();
echo 'Witaj, '.$_SESSION['nick'];
?>

Powyższy przykład demonstruje na 2 plikach jak można użyć sesji. Najpierw uruchamiamy plik start_session.php, który tworzy nową sesję i przypisuje zmiennej sesyjnej nick wartość 'Kodie'. Następnie uruchamiamy plik show_variable.php, który otwiera wcześniej utworzoną sesję oraz wypisuje wartość zmiennej sesyjnej nick. Warto zauważyć, że nie musimy martwić się czy sesja została już wcześniej uruchomiona czy nie. session_start sam zdecyduje czy trzeba utworzyć nową sesję czy zwrócić otwartą sesję. Jednak zauważmy, że jeśli zostanie utworzona nowa sesja (tzn. Nie uruchomiono wcześniej skryptu start_session.php), to dostaniemy informacje (lub nie – w zależności od konfiguracji PHP), że nie ma takiej zmiennej sesyjnej.

Zaraz, a ktoś może powiedzieć, że ten kod u niego nie działa, chociaż uruchamia wszystko po kolei. Najprawdopodobniej nie ma włączonych ciasteczek, więc musimy przekazać SID używając metody GET. Oto poprawiony kod, po uruchomieniu session_start naciskamy link zawierający zmienną SID.

session_start.php:

 <?php
session_start();
$_SESSION['nick'] = 'Kodie';
echo 'show_variable.php?sid='.session_id();
?>

Zarządzanie sesją

Teraz zajmiemy się czymś bardziej skomplikowanym. Użyjemy wzorca projektowego singleton, w celu zapewnienia, iż sesja zostanie uruchomiona tylko raz na przeładowanie strony (co w prawdzie nie jest niebezpieczne, ale jednak zajmuje trochę czasu).

 <?php
/*
Klasa Session używana jest do przechowywania informacji o sesji
*/

class Session{

private $instance;

//Prywatny konstruktor
private function __construct(){
session_start();
}

//ustawia wartość zmiennej sesyjnej
public function setValue($name, $value){
$ret = false;
if(isset($_SESSION[$name]))$ret = $value;
$_SESSION[$name] = $value;
return $ret;
}

//zwraca wartość zmiennej sesyjnej
public function getValue($name, $default = ''){
if(!isset($_SESSION[$name])) $this->setValue( $name, $default);
return $_SESSION[$name];
}

//niszczy sesje
public function destroy(){
//wyczyszczenie zmiennych
$_SESSION = array();

if(isset($_COOKIE[session_name()])){
unset($_COOKIE[session_name()]);
}
if(!session_destroy())throw new Exception("Nie powiodło się niszczenie sesji");
}

//zwraca identyfikator sesji
public function getSID(){
return session_id();
}

//zwraca obiekt Session
public static function getSession(){
if(Session::$instance == null){
Session::$instance = new Session();
}
return Session::$instance;
}

}
?>

Kod powinien być dosyć zrozumiały. Napisany został w PHP 5 i jest niezgodny z PHP 4 (wymagałby pewnych przeróbek). Jeżeli pierwszy raz widzisz deklaracje klasy powinieneś zajrzeć do działu PHP na naszej stronie i poczytać o programowaniu obiektowym.

Krótkie wyjaśnienie jak działa wzorzec singleton. Otóż w klasie zadeklarowano zmienną statyczną (static) $instance co oznacza, że w każdym obiekcie tej klasy zmienna ma tą samą wartość. Co więcej, do tej zmiennej możemy odwoływać się bez utworzenia obiektu. W zmiennej tej przechowujemy instancję klasy lub wartośćć null jeżeli nie utworzono jeszcze obiektu. Następnie w statycznej funkcji getSession sprawdzamy czy $instance jest nullem. Jeżeli tak tworzymy nowy obiekt. Następnie zwracamy wartość $instance.

Wytłumaczenia może wymagać także metoda destroy, która najpierw usuwa wszystkie zmienne sesyjne (nadpisując je pustą tablicą). Następnie usuwa ciastko przechowujące identyfikator sesji oraz wywołuje opisana wcześniej funkcję session_destroy. Funkcja session_name zwraca nazwę sesji. Nazwę tę można ustawić w pliku konfiguracyjnymi lub przed wywołaniem funkcji session_start.

Podsumowanie

Bez sesji trudno wyobrazić sobie każdy dobry system logowania. Jednak trzeba wiedzieć, że system ten podatny jest na ataki, tzw. Przejęcia sesji. Pamiętajmy, więc, żeby pisząc autoryzację opartą na sesjach, zawsze sprawdzać czy dane sesyjne pokrywają się z danymi zalogowanego użytkownika (np. Odciski md5 hasła).

Kodie @ 11-07-2006 19:56
Brak komentarzy...
Copyright © 2005-2006 Compzone.Org. Kopiowanie i wykorzystywanie materiałów zawartych na tej stronie bez zgody autora zabronione!