Ukratko: HTTP između dvaju zahtjeva ne pamti ništa. PHP sesija to rješava: PHP dodjeljuje slučajni ID sesije, šalje ga pregledniku kao kolačić, a pripadajuće podatke sprema na poslužitelju, prema zadanim postavkama kao datoteku. Pri svakom sljedećem zahtjevu session_start() podatke ponovno učitava prema ID-u. PHP sesiji pripada i funkcija session.upload_progress, za koju php.net zbog PHP2Shella preporučuje privremeno isključivanje na strani poslužitelja.
Zašto web-aplikacije trebaju sesije
Svaki zahtjev prema web-poslužitelju stoji samostalno. Bez dodatnog mehanizma web-trgovina pri kliku na „Košarica“ ne bi znala tko je upravo nešto u nju stavio, a administratorsko sučelje morilo bi lozinkom pri svakom kliku. Sesije povezuju pojedinačne zahtjeve u jednu sjednicu.
Za donositelje odluka to znači: ID sesije nakon prijave vrijedi koliko korisničko ime i lozinka zajedno. Za administratore to znači: gdje i kako leže podaci sesije sigurnosno je pitanje, osobito na poslužiteljima s više web-stranica.
Što se događa kod session_start()
Slijed je pri svakom zahtjevu isti i može se opisati u pet koraka:
- Preglednik šalje kolačić s nazivom sesije, prema zadanim postavkama
PHPSESSID. session_start()čita ID i predaje ga rukovatelju pohrane, prema zadanim postavkamafiles.- Rukovatelj učitava spremljene podatke, PHP ih pomoću
serialize_handlerpretvara natrag i popunjava$_SESSION. - Skripta čita i mijenja
$_SESSIONkao obično polje. - Na kraju zahtjeva PHP podatke zapisuje natrag. S
session.lazy_write(zadano: uključeno) samo ako su se promijenili.
<?php
session_start();
$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];
Ako sesija još ne postoji, PHP stvara novi ID i postavlja kolačić. Ako je session.use_strict_mode aktivan, PHP odbija nepoznate ID-ove koje zadaje preglednik i stvara novi. PHP priručnik tu postavku za osnovnu sigurnost naziva obveznom.
Zadane vrijednosti koje valja poznavati
Sljedeće vrijednosti vrijede prema PHP priručniku ako nije konfigurirano drukčije. Mnoge distribucije i pružatelji hostinga postavljaju vlastite vrijednosti, pa je uvijek važna stvarno djelotvorna konfiguracija.
| Postavka | Zadano | Značenje |
|---|---|---|
session.save_handler |
files |
mjesto pohrane podataka, moguć i Redis ili baza podataka |
session.name |
PHPSESSID |
naziv kolačića |
session.serialize_handler |
php |
format spremljenih podataka |
session.use_strict_mode |
0 |
nepoznati ID-ovi se prihvaćaju |
session.use_only_cookies |
1 |
nema ID-a sesije u adresi |
session.cookie_httponly |
0 |
JavaScript može čitati kolačić |
session.cookie_secure |
0 |
kolačić i putem nešifriranog HTTP-a |
session.cookie_samesite |
prazno | nema SameSite atributa |
session.gc_maxlifetime |
1440 |
sekunde do mogućeg pospremanja |
session.gc_probability / gc_divisor |
1 / 100 |
pospremanje otprilike pri svakom stotom pokretanju |
session.upload_progress.enabled |
1 |
napredak uploada upisuje se u sesiju |
Vrijednosti za cookie_httponly, cookie_secure i use_strict_mode dakle nisu iz tvornice postavljene na sigurnost. Kako ih ispravno postaviti, opisuje vodič Osiguravanje sesija u PHP-u. Postavke session.sid_length i session.sid_bits_per_character od PHP-a 8.4.0 označene su kao zastarjele.
Izravno postavljanje kolačića
Uz kolačić sesije aplikacija može postavljati i vlastite kolačiće. Od PHP-a 7.3.0 setcookie() za to prima polje s opcijama, uključujući samesite. Od PHP-a 8.5.0 postoji i opcija partitioned.
<?php
setcookie('sprache', 'de', [
'expires' => time() + 60 * 60 * 24 * 30,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);
Prema priručniku kod samesite jednakog None mora biti postavljen i secure, inače preglednik blokira kolačić. Kolačići su podaci preglednika: njihov sadržaj pri sljedećem zahtjevu vraća se putem $_COOKIE i mora se provjeriti kao svaki drugi unos. Više na stranici Superglobals.
session.upload_progress: prikaz napretka uploada
PHP tijekom uploada datoteke može upisivati napredak u sesiju. Za to obrazac šalje skriveno polje s nazivom iz session.upload_progress.name, prema zadanim postavkama PHP_SESSION_UPLOAD_PROGRESS. PHP tada podatke pohranjuje u $_SESSION pod ključem s prefiksom upload_progress_, s podacima poput vremena početka, ukupne veličine i već obrađenih bajtova.
Važno za razumijevanje: prema priručniku PHP te informacije upisuje u sesiju prije nego što se izvrši ijedna skripta. Funkcija dakle radi tijekom obrade zahtjeva, još prije koda aplikacije. Njezine postavke su tipa INI_PERDIR i ne mogu se mijenjati tijekom rada.
Sesije i PHP2Shell: prijelazna mjera
Kao jednu od prijelaznih mjera protiv PHP2Shell ranjivosti php.net navodi postavljanje session.upload_progress.enabled=0 u php.ini, u FPM poolu ili u konfiguraciji poslužitelja i zatim ponovno pokretanje svih workera, izričito ne putem ini_set() ili .user.ini. Dana 23. 10. 2026. dodana je napomena o CVE-2026-115560, s istom mjerom dok ne izide sljedeće redovito bugfix izdanje.
; FPM pool web-stranice, nakon toga ponovno pokrenuti sve workere
php_admin_flag[session.upload_progress.enabled] = off
Prema stručnim izvještajima ta postavka sama ne zatvara obje ranjivosti. Obveza ostaje ažuriranje na PHP 8.5.12, 8.4.27, 8.3.36 ili 8.2.35. Koristi li Vaša aplikacija uopće napredak uploada i kako postavku trajno postaviti, opisuje članak Isključivanje session.upload_progress.
Kako PHP SOS konkretno pomaže?
- Očitavamo stvarno djelotvorne postavke sesija po web-stranici, a ne samo vrijednosti naredbenog retka.
- PHP2Shell prijelazne mjere postavljamo po poolu, ponovno pokrećemo sve workere i provjeravamo rezultat.
- Mjesta pohrane sesija i korisnike poolova između web-stranica razdvajamo u okviru ojačavanja poslužitelja.
- Nakon incidenta poništavamo sve postojeće sjednice kako ukradeni ID-ovi sesija postanu bezvrijedni.
Česta pitanja
Koja je razlika između kolačića i sesije?
Kolačić je mali zapis koji preglednik sprema i šalje sa svakim zahtjevom. Sesija stvarne podatke sprema na poslužitelju; u kolačiću stoji samo slučajni identifikator, ID sesije.
Koliko dugo živi PHP sesija?
Kolačić sesije prema zadanim postavkama vrijedi dok se preglednik ne zatvori. Podaci na poslužitelju smiju se pospremiti nakon session.gc_maxlifetime, prema zadanim postavkama 1440 sekundi bez pristupa. Kada se to stvarno dogodi, ovisi o logici pospremanja sustava.
Što radi session.upload_progress?
Funkcija tijekom uploada datoteke upisuje napredak u sesiju kako bi ga drugi zahtjev mogao prikazati. Prema zadanim postavkama je aktivna. Zbog PHP2Shella php.net preporučuje da se privremeno isključi na strani poslužitelja.
Je li dovoljno isključiti session.upload_progress putem ini_set()?
Ne. Postavka se prema priručniku ionako ne može mijenjati tijekom rada, a php.net izričito navodi php.ini, FPM pool ili konfiguraciju poslužitelja kao ispravna mjesta, a ne ini_set() ili .user.ini. Nakon toga ponovno pokrenite sve workere.