Curs Web Development
Curs HTML
Curs CSS
Curs Javascript
Curs PHP
Curs Phyton
Curs SQL
Curs SEO

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

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

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

Top