Sesiuni, Cookies & Securitate
Ce este o sesiune? session_start()
O sesiune în PHP este o metodă prin care serverul stochează informații despre un utilizator pe durata vizitei sale (sau a mai multor vizite) într-o aplicație web. Astfel, datele sunt păstrate chiar dacă utilizatorul navighează între mai multe pagini.
Spre deosebire de cookies (care se salvează pe calculatorul utilizatorului), datele din
sesiune sunt stocate pe server și sunt identificate printr-un session ID unic, trimis utilizatorului
sub formă de cookie mic (de obicei PHPSESSID).
Inițializarea unei sesiuni
Pentru a porni o sesiune în PHP, trebuie să folosim funcția session_start(). Aceasta se pune
întotdeauna la începutul scriptului PHP, înainte de orice output HTML.
<?php
// Pornim sesiunea
session_start();
// Stocăm o valoare în sesiune
$_SESSION["username"] = "Ion Popescu";
echo "Sesiunea a fost pornită și am salvat username = " . $_SESSION["username"];
?>
În exemplul de mai sus, am creat o sesiune și am salvat un câmp username. Acest lucru permite ca
informația să fie disponibilă în toate paginile în care pornim sesiunea cu session_start().
Stocarea datelor în sesiune
Odată ce am pornit sesiunea cu session_start(), putem salva și accesa variabile globale folosind
superglobala $_SESSION. Aceste variabile rămân disponibile pe durata sesiunii, indiferent de
pagină.
Exemplu: Salvarea și citirea variabilelor de sesiune
<?php
session_start(); // pornim sesiunea
// Salvăm date în sesiune
$_SESSION["username"] = "Maria Ionescu";
$_SESSION["email"] = "maria@example.com";
$_SESSION["role"] = "administrator";
// Citim datele din sesiune
echo "Bun venit, " . $_SESSION["username"] . "!<br>";
echo "Email: " . $_SESSION["email"] . "<br>";
echo "Rol: " . $_SESSION["role"] . "<br>";
?>
Observație: aceste variabile vor fi disponibile în orice altă pagină PHP unde apelăm
session_start(). De exemplu, dacă avem o pagină profil.php, putem afișa datele
utilizatorului direct din sesiune.
Exemplu: Accesarea datelor într-o altă pagină
<?php
session_start(); // sesiunea trebuie pornită pe fiecare pagină
if (isset($_SESSION["username"])) {
echo "Salut din profil, " . $_SESSION["username"] . "!";
} else {
echo "Nu există utilizator conectat.";
}
?>
Astfel putem construi un sistem simplu de login: odată ce utilizatorul se autentifică, datele lui sunt salvate în sesiune și accesibile pe toate paginile site-ului.
Crearea și citirea cookie-urilor
Cookie-urile sunt fișiere mici stocate pe calculatorul utilizatorului. Ele rețin informații chiar și după ce
sesiunea s-a închis (spre deosebire de $_SESSION, care dispare când închidem browserul).
Setarea unui cookie
Pentru a crea un cookie, folosim funcția setcookie(). Un cookie are nume, valoare, timp de
expirare și opțional alte atribute (path, domeniu, securitate).
<?php
// Creăm un cookie "username" valabil 1 oră
setcookie("username", "Maria", time() + 3600, "/");
// Creăm un cookie "preferinte" valabil 1 zi
setcookie("preferinte", "dark-mode", time() + 86400, "/");
?>
Citirea unui cookie
Cookie-urile setate pot fi citite cu superglobala $_COOKIE.
<?php
if (isset($_COOKIE["username"])) {
echo "Bun venit, " . $_COOKIE["username"];
} else {
echo "Nu există cookie pentru utilizator.";
}
?>
Exemplu practic
Putem folosi cookie-uri pentru a reține preferințele unui vizitator (de exemplu, tema selectată).
<?php
// Dacă utilizatorul alege tema "dark", salvăm în cookie
if (isset($_GET["tema"])) {
$tema = $_GET["tema"];
setcookie("tema", $tema, time() + 86400, "/"); // valabil 1 zi
echo "Ai ales tema: $tema";
}
// La fiecare vizită verificăm cookie-ul
if (isset($_COOKIE["tema"])) {
echo "<br>Tema salvată este: " . $_COOKIE["tema"];
}
?>
<a href="?tema=light">Tema Light</a> |
<a href="?tema=dark">Tema Dark</a>
Astfel, chiar dacă utilizatorul închide browserul, preferința pentru temă va fi reținută la următoarea vizită.
Ștergerea cookie-urilor
Un cookie nu poate fi „șters” direct din PHP. Pentru a-l șterge, trebuie să îl rescriem cu o dată de expirare în trecut.
Exemplu simplu
<?php
// Ștergem cookie-ul "username"
setcookie("username", "", time() - 3600, "/");
echo "Cookie-ul 'username' a fost șters.";
?>
Exemplu practic cu verificare
<?php
// Dacă utilizatorul apasă pe "Logout", ștergem cookie-ul
if (isset($_GET["logout"])) {
setcookie("username", "", time() - 3600, "/");
echo "Te-ai delogat. Cookie-ul a fost șters.";
} else {
if (isset($_COOKIE["username"])) {
echo "Bun venit din nou, " . $_COOKIE["username"];
echo "<br><a href='?logout=1'>Logout</a>";
} else {
echo "Nu există niciun cookie activ.";
}
}
?>
Astfel, cookie-ul username se elimină atunci când utilizatorul apasă pe butonul de logout sau
când expiră timpul setat inițial.
Hashing parole (password_hash, password_verify)
Parolele NU trebuie niciodată stocate în clar în baza de date. În schimb, folosim funcțiile
password_hash() și password_verify() pentru a securiza datele.
Crearea unui hash pentru o parolă
<?php
// Exemplu: utilizator introduce parola
$parola = "secret123";
// Generăm un hash securizat
$hash = password_hash($parola, PASSWORD_DEFAULT);
echo "Hash-ul generat: " . $hash;
?>
Verificarea unei parole
<?php
$parola_introdusa = "secret123"; // parola introdusă la login
$hash_salvat = '$2y$10$eImiTXuWVxfM37uY4JANjQ=='; // exemplu hash din DB
if (password_verify($parola_introdusa, $hash_salvat)) {
echo "✅ Parola este corectă!";
} else {
echo "❌ Parola incorectă!";
}
?>
Explicații
password_hash()folosește algoritmul Bcrypt sau Argon2, în funcție de versiunea PHP.password_verify()compară parola introdusă cu hash-ul din baza de date.- Hash-ul este unic de fiecare dată (datorită „salt-ului”), dar verificarea funcționează corect.
Protecție CSRF & regenerare session_id
CSRF (Cross-Site Request Forgery) este un atac prin care un utilizator autentificat este păcălit să trimită
cereri neintenționate către server. Pentru a preveni acest tip de atac, folosim token-uri CSRF
și regenerăm periodic session_id().
Generarea și folosirea unui token CSRF
<?php
session_start();
// Dacă nu există token, îl creăm
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?>
<form method="post" action="procesare.php">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<input type="text" name="comentariu" placeholder="Scrie un comentariu">
<button type="submit">Trimite</button>
</form>
Validarea token-ului
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
die("❌ Atac CSRF detectat!");
}
echo "✅ Cerere validă. Comentariul a fost trimis.";
}
?>
Regenerarea session_id()
<?php
session_start();
// Regenerăm ID-ul sesiunii după login
if (!isset($_SESSION['logged_in'])) {
$_SESSION['logged_in'] = true;
session_regenerate_id(true); // șterge ID-ul vechi și creează unul nou
echo "ID sesiune regenerat pentru securitate.";
}
?>
Explicații
bin2hex(random_bytes(32))→ generează un token sigur și unic pentru fiecare sesiune.- Token-ul este pus în formular ca
hidden input. - La trimiterea formularului, verificăm dacă token-ul din
POSTcorespunde cu cel din sesiune. session_regenerate_id(true)protejează împotriva atacurilor de tip Session Fixation.
Exemplu practic: Login simplu cu sesiuni
Acest exemplu demonstrează un flux de autentificare simplu și sigur în PHP. Se verifică datele introduse, parola este criptată, iar după autentificare se creează sesiunea utilizatorului.
Formular login (ex-login.php)
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h2>Login simplu</h2>
<?php if (isset($_SESSION['error'])): ?>
<p style="color:red;"><?php echo $_SESSION['error']; unset($_SESSION['error']); ?></p>
<?php endif; ?>
<form method="POST" action="ex-login_process.php">
<label>Username: <input type="text" name="username"></label><br><br>
<label>Parola: <input type="password" name="password"></label><br><br>
<button type="submit">Login</button>
</form>
</body>
</html>
Procesarea login-ului (ex-login_process.php)
<?php
session_start();
// Exemplu fix (în realitate verifici din DB + password_verify)
$validUser = "admin";
$validPass = "1234";
if ($_POST['username'] === $validUser && $_POST['password'] === $validPass) {
$_SESSION['user'] = $validUser;
header("Location: ex-dashboard.php");
exit;
} else {
$_SESSION['error'] = "Date de autentificare invalide!";
header("Location: ex-login.php");
exit;
}
?>
Pagina profil (ex-dashboard.php)
<?php
session_start();
if (!isset($_SESSION['user'])) {
header("Location: ex-login.php");
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Dashboard</title>
</head>
<body>
<h2>Bun venit, <?php echo htmlspecialchars($_SESSION['user']); ?>!</h2>
<p>Aceasta este o zonă protejată.</p>
<a href="ex-logout.php">Logout</a>
</body>
</html>
Logout (logout.php)
<?php
session_start();
session_unset();
session_destroy();
header("Location: ex-login.php");
exit;
?>
Exemplu Login. Acceseaza link-ul pentru a vedea exemplul live.
User: admin
Parola:
1234
🧠 Quiz - Sesiuni, Cookies & Securitate în PHP
