Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

Sesije i kolačići u PHP-u

Sesije od HTTP-a bez stanja stvaraju prijavu koja traje kroz više stranica. Ovdje piše kako PHP to rješava iznutra, koje zadane vrijednosti vrijede i kakve veze session.upload_progress ima s PHP2Shellom.

Stanje 4 min čitanjaPHP znanje

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:

  1. Preglednik šalje kolačić s nazivom sesije, prema zadanim postavkama PHPSESSID.
  2. session_start() čita ID i predaje ga rukovatelju pohrane, prema zadanim postavkama files.
  3. Rukovatelj učitava spremljene podatke, PHP ih pomoću serialize_handler pretvara natrag i popunjava $_SESSION.
  4. Skripta čita i mijenja $_SESSION kao obično polje.
  5. 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.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć