# Sesije i kolačići u PHP-u

> Kako rade PHP sesije i kolačići: ID sesije, pohrana, zadane vrijednosti u php.ini, napredak uploada i prijelazna mjera za PHP2Shell.

Izvor: https://phpsos.de/hr/php/sessions-und-cookies/  
Stanje: 25.10.2026  
Pružatelj: PHP SOS, PHP hitna pomoć i sigurnost poslužitelja. Hitna pomoć putem WhatsAppa: https://wa.me/491736494914?text=Pozdrav%20PHP%20SOS%2C%20trebamo%20pomo%C4%87%20s%20na%C5%A1im%20PHP%20poslu%C5%BEiteljem.%20Tvrtka%3A%20%E2%80%A6%20Web-stranica%3A%20%E2%80%A6

**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
<?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](https://phpsos.de/hr/ratgeber/session-sicherheit-php/). 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
<?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](https://phpsos.de/hr/php/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](https://phpsos.de/hr/php2shell/cve-2026-115560/), s istom mjerom dok ne izide sljedeće redovito bugfix izdanje.

```ini
; 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](https://phpsos.de/hr/blog/session-upload-progress-abschalten/).

## 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](https://phpsos.de/hr/leistungen/server-haertung/).
- 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

- [PHP priručnik: Konfiguracija sesija](https://www.php.net/manual/de/session.configuration.php)
- [PHP priručnik: Napredak uploada sesije](https://www.php.net/manual/de/session.upload-progress.php)
- [PHP priručnik: setcookie](https://www.php.net/manual/en/function.setcookie.php)
- [php.net: Sigurnosne objave](https://www.php.net/)
