Situația actuală: PHP2Shell. Două vulnerabilități critice PHP (CVSS 9.2) permit cod malițios fără autentificare. Patchuri din 21.10.2026.Ce este de făcut acum →

Sesiuni și cookie-uri în PHP

Sesiunile transformă HTTP-ul fără stare într-o autentificare care ține pe mai multe pagini. Aici vedeți cum o rezolvă PHP intern, ce valori implicite se aplică și ce legătură are session.upload_progress cu PHP2Shell.

Stadiu 5 min de cititCunoștințe PHP

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
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. Setările session.sid_length și session.sid_bits_per_character sunt marcate ca depășite din PHP 8.4.0.

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
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.

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, cu aceeași remediere până la următoarea lansare regulată de corecții.

; 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.

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.
  • 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

Contact imediat

Fiecare oră contează. Scrieți-ne acum.

Descrieți pe scurt sistemul, versiunea PHP și ce ați observat. Ne vom face auziți, clarificăm situația și lucrăm la distanță până când incidentul este încheiat și documentat.

Ajutor imediat