# Sesiuni și cookie-uri în PHP

> Cum funcționează sesiunile și cookie-urile PHP: ID de sesiune, stocare, valori implicite din php.ini, progresul upload-ului și măsura provizorie PHP2Shell.

Sursa: https://phpsos.de/ro/php/sessions-und-cookies/  
Stadiu: 25.10.2026  
Furnizor: PHP SOS, Asistență de urgență PHP și securitatea serverelor. Ajutor imediat pe WhatsApp: https://wa.me/491736494914?text=Bun%C4%83%20ziua%2C%20PHP%20SOS%2C%20avem%20nevoie%20de%20ajutor%20cu%20serverul%20nostru%20PHP.%20Firma%3A%20%E2%80%A6%20Site%3A%20%E2%80%A6

**Pe scurt:** HTTP nu reține nimic între două cereri. O sesiune PHP rezolvă asta: PHP atribuie un ID de sesiune aleatoriu, îl trimite browserului ca cookie și stochează datele corespunzătoare pe server, implicit ca fișier. La fiecare cerere următoare, `session_start()` citește din nou datele pe baza ID-ului. La sesiunea PHP aparține și funcția `session.upload_progress`, pe care php.net recomandă s-o dezactivați temporar pe partea de server din cauza PHP2Shell.

## De ce au nevoie aplicațiile web de sesiuni

Fiecare cerere către un server web stă pe cont propriu. Fără un mecanism suplimentar, un magazin nu ar mai ști la clicul pe „Coș” cine tocmai a pus ceva în el, iar o zonă de administrare ar trebui să ceară parola la fiecare clic. Sesiunile leagă cererile individuale într-o sesiune.

Pentru factorii de decizie asta înseamnă: după autentificare, ID-ul de sesiune valorează cât numele de utilizator și parola la un loc. Pentru administratori înseamnă: unde și cum sunt stocate datele de sesiune este o chestiune de securitate, mai ales pe serverele cu mai multe site-uri.

## Ce se întâmplă la session_start()

Procesul este același la fiecare cerere și poate fi descris în cinci pași:

1. Browserul trimite cookie-ul cu numele sesiunii, implicit `PHPSESSID`.
2. `session_start()` citește ID-ul și îl transmite handlerului de stocare, implicit `files`.
3. Handlerul încarcă datele stocate, PHP le reconvertește cu `serialize_handler` și umple `$_SESSION`.
4. Scriptul citește și modifică `$_SESSION` ca pe un array obișnuit.
5. La sfârșitul cererii, PHP scrie datele înapoi. Cu `session.lazy_write` (implicit: pornit) doar dacă s-au modificat.

```php
<?php
session_start();

$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];
```

Dacă nu există încă o sesiune, PHP generează un ID nou și setează cookie-ul. Dacă `session.use_strict_mode` este activ, PHP respinge ID-uri necunoscute, impuse de browser, și generează unul nou. Manualul PHP descrie această setare drept obligatorie pentru securitatea de bază.

## Valori implicite pe care ar trebui să le cunoașteți

Valorile următoare se aplică, potrivit manualului PHP, dacă nu este configurat altceva. Multe distribuții și furnizori de hosting își setează valori proprii, de aceea contează mereu configurația efectiv aplicată.

| Setare | Implicit | Semnificație |
|---|---|---|
| `session.save_handler` | `files` | locul de stocare a datelor, posibil și Redis sau bază de date |
| `session.name` | `PHPSESSID` | numele cookie-ului |
| `session.serialize_handler` | `php` | formatul datelor stocate |
| `session.use_strict_mode` | `0` | ID-urile necunoscute sunt acceptate |
| `session.use_only_cookies` | `1` | niciun ID de sesiune în adresă |
| `session.cookie_httponly` | `0` | JavaScript poate citi cookie-ul |
| `session.cookie_secure` | `0` | cookie-ul și prin HTTP necriptat |
| `session.cookie_samesite` | gol | niciun atribut SameSite |
| `session.gc_maxlifetime` | `1440` | secunde până la posibila curățare |
| `session.gc_probability` / `gc_divisor` | `1` / `100` | curățare la aproximativ fiecare a suta pornire |
| `session.upload_progress.enabled` | `1` | progresul upload-ului este scris în sesiune |

Valorile pentru `cookie_httponly`, `cookie_secure` și `use_strict_mode` nu sunt deci, din fabrică, croite pentru securitate. Cum le setați corect descrie ghidul [Securizarea sesiunilor în PHP](https://phpsos.de/ro/ratgeber/session-sicherheit-php/). Setările `session.sid_length` și `session.sid_bits_per_character` sunt marcate ca depășite din PHP 8.4.0.

## Setarea directă a cookie-urilor

Pe lângă cookie-ul de sesiune, o aplicație poate seta cookie-uri proprii. Din PHP 7.3.0, `setcookie()` acceptă pentru aceasta un array cu opțiuni, inclusiv `samesite`. Din PHP 8.5.0 există suplimentar opțiunea `partitioned`.

```php
<?php
setcookie('sprache', 'de', [
    'expires'  => time() + 60 * 60 * 24 * 30,
    'path'     => '/',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);
```

Potrivit manualului, dacă `samesite` este `None`, trebuie setat și `secure`, altfel browserul blochează cookie-ul. Cookie-urile sunt date ale browserului: conținutul lor revine la următoarea cerere prin `$_COOKIE` și trebuie verificat ca orice altă introducere. Mai multe pe pagina [Superglobals](https://phpsos.de/ro/php/superglobals/).

## session.upload_progress: indicator de progres pentru upload-uri

PHP poate scrie în sesiune, în timpul unui upload de fișier, progresul. Pentru aceasta, formularul trimite un câmp ascuns cu numele din `session.upload_progress.name`, implicit `PHP_SESSION_UPLOAD_PROGRESS`. PHP depune apoi datele în `$_SESSION` sub o cheie cu prefixul `upload_progress_`, cu informații precum ora de început, dimensiunea totală și octeții deja prelucrați.

Important pentru înțelegere: potrivit manualului, PHP scrie aceste informații în sesiune înainte ca vreun script să fie executat. Funcția lucrează deci în timpul prelucrării cererii, încă înaintea codului aplicației. Setările ei sunt de tip `INI_PERDIR` și nu pot fi modificate în timpul execuției.

## Sesiuni și PHP2Shell: măsura provizorie

Ca una dintre măsurile provizorii împotriva vulnerabilităților PHP2Shell, php.net menționează setarea `session.upload_progress.enabled=0` în php.ini, în pool-ul FPM sau în configurația serverului, urmată de repornirea tuturor workerilor, explicit nu prin `ini_set()` sau `.user.ini`. La 23.10.2026 s-a adăugat avizul despre [CVE-2026-115560](https://phpsos.de/ro/php2shell/cve-2026-115560/), cu aceeași remediere până la următoarea lansare regulată de corecții.

```ini
; pool-ul FPM al site-ului, apoi reporniți toți workerii
php_admin_flag[session.upload_progress.enabled] = off
```

Potrivit rapoartelor de specialitate, această setare singură nu închide ambele vulnerabilități. Rămâne obligatorie actualizarea la PHP 8.5.12, 8.4.27, 8.3.36 sau 8.2.35. Dacă aplicația dumneavoastră folosește deloc progresul upload-ului și cum setați setarea durabil descrie articolul [Dezactivarea session.upload_progress](https://phpsos.de/ro/blog/session-upload-progress-abschalten/).

## Cum ajută PHP SOS concret?

- Citim setările de sesiune efectiv aplicate pentru fiecare site, nu doar valorile din linia de comandă.
- Setăm măsurile provizorii PHP2Shell pentru fiecare pool, reporniți toți workerii și verificăm rezultatul.
- Separăm locurile de stocare a sesiunilor și utilizatorii de pool între site-uri, în cadrul [întăririi serverului](https://phpsos.de/ro/leistungen/server-haertung/).
- După un incident invalidăm toate sesiunile existente, pentru ca ID-urile de sesiune furate să devină inutile.


## Întrebări frecvente

**Care este diferența dintre cookie și sesiune?**  
Un cookie este un mic set de date pe care browserul îl stochează și îl trimite la fiecare cerere. O sesiune stochează datele propriu-zise pe server; în cookie se află doar un identificator aleatoriu, ID-ul de sesiune.

**Cât trăiește o sesiune PHP?**  
Cookie-ul de sesiune este valabil implicit până la închiderea browserului. Datele de pe server pot fi curățate după session.gc_maxlifetime, implicit 1440 de secunde fără acces. Când se întâmplă asta efectiv depinde de logica de curățare a sistemului.

**Ce face session.upload_progress?**  
Funcția scrie în sesiune, în timpul unui upload de fișier, progresul, pentru ca o a doua cerere să îl poată afișa. Este activă implicit. Din cauza PHP2Shell, php.net recomandă dezactivarea ei temporară pe partea de server.

**Este suficient să dezactivez session.upload_progress prin ini_set()?**  
Nu. Setarea nu poate fi oricum modificată în timpul execuției, potrivit manualului, iar php.net menționează explicit php.ini, pool-ul FPM sau configurația serverului ca locuri corecte, nu ini_set() sau .user.ini. Apoi reporniți toți workerii.

## Surse

- [Manualul PHP: configurarea sesiunilor](https://www.php.net/manual/de/session.configuration.php)
- [Manualul PHP: progresul upload-ului în sesiune](https://www.php.net/manual/de/session.upload-progress.php)
- [Manualul PHP: setcookie](https://www.php.net/manual/en/function.setcookie.php)
- [php.net: anunțuri de securitate](https://www.php.net/)
