Sesje w PHP

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 4493 razy

Mechanizm sesji umożliwia przechowywanie ważnych danych, które będą dostępne na kolejnych podstronach tej samej domeny po stronie serwera. Aby zidentyfikować daną osobę korzystającą z strony tworzony jest identyfikator sesji, gdy ta nie została jeszcze zainicjalizowana. Do utworzenia sesji na samym początku kodu strony należy umieścić wywołanie funkcji session_start a następnie sprawdzić, czy superglobalna tablica $_SESSION została zainicjalizowana, jeżeli nie to należy wygenerować losowy identyfikator sesji za pomocą funkcji session_regenerate_id co zapobiegnie możliwości pominięcia mechanizmu logowania. Identyfikator sesji jest jedyną zmienną przechowywaną w pliku cookie po stronie użytkownika, a jego wykradnięcie może umożliwić podszycie się pod kogoś. Aby zapobiec temu warto zapamiętywać w sesji takie informacje jak: adres ip komputera oraz nazwa przeglądarki, z której użytkownik korzystał a następnie weryfikować te dane. Adres ip osoby odwiedzającej jest dostępny w tablicy $_SERVER['REMOTE_ADDR'].

<?php session_start(); // rozpoczęcie sesji // Pseudo baza danych użytkowników $users = array( 1 => array('login' => 'user1', 'password' => password_hash('password1', PASSWORD_BCRYPT)), array('login' => 'user2', 'password' => password_hash('password2', PASSWORD_BCRYPT)), array('login' => 'user3', 'password' => password_hash('password3', PASSWORD_BCRYPT))); // funkcja sprawdzająca, czy dane logowania są poprawne function UserExist($login, $password){ global $users; foreach($users as $id => $user){ if($login == $user['login']){ if(password_verify($password, $user['password'])){ return $id; }else{ echo("<p>Ty próbować, źle zalogować, hasło nie dobre, bardzo nie ładnie. Proszę je wpisać teraz poprawnie.</p>"); return false; } } } return false; } if(isset($_POST['login']) && isset($_POST['password'])){ // sprawdzanie, czy dane do logowania zostały wysłane $id = UserExist($_POST['login'], $_POST['password']); // pozyskiwanie id użytkownika lub false gdy hasło i login są niepoprawne $_SESSION['id'] = $id ? $id : 0; // ustawianie id użytkownika $_POST = array(); }else if(isset($_POST['logout'])){ // wylogowanie się $_SESSION = array(); // usuwanie danych if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', 0); } session_destroy(); } if(!isset($_SESSION['initial'])){ session_regenerate_id(true); // generowanie losowego id sesji $_SESSION['initial'] = true; $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; // zapisywanie adresu ip $_SESSION['nr'] = 1; // licznik odwiedzin na 1 $_SESSION['id'] = 0; // id użytkownika na 0 }else{ $_SESSION['nr'] += 1; // zwiększanie licznika odwiedzin } if(!$_SESSION['id']){ // jak id nie jest ustawione na wartość różną od 0 to trzeba wyświetlić formularz logowania echo("<form action='Sesje.php' method='POST'>"); echo("<p>Login: <input type='text' name='login'/></p>"); echo("<p>Password: <input type='password' name='password'/></p>"); echo("<p><button type='submit'>Zaloguj</button></p>"); echo("</form>"); }else{ // w przeciwnym przypadku formularz wylogowania echo("<form action='Sesje.php' method='POST'>"); echo("<input type='hidden' name='logout' value='logout' />"); echo("<p><button type='submit'>Wyloguj</button></p>"); echo("</form>"); } if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']){ // jak ip sesji się nie zgadza to kończymy zabawę die('Niestety mój stary Jedi przyjacielu, nie podszyjesz się pod niego!'); } if($_SESSION['id'] > 0){ echo("<p>Witaj: " . $users[$_SESSION['id']]['login'] . "</p>"); } echo("Stronę nawiedziłeś już: " . $_SESSION['nr'] . " razy"); ?>
Propozycje książek