# Sesijos ir slapukai PHP

> Kaip veikia PHP sesijos ir slapukai: sesijos ID, saugojimas, php.ini numatytosios reikšmės, įkėlimo eiga ir PHP2Shell pereinamoji priemonė.

Šaltinis: https://phpsos.de/lt/php/sessions-und-cookies/  
Būsena: 2026-10-25  
Teikėjas: PHP SOS, PHP avarinė pagalba ir serverio sauga. Skubi pagalba per „WhatsApp“: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20reikia%20pagalbos%20su%20m%C5%ABs%C5%B3%20PHP%20serveriu.%20%C4%AEmon%C4%97%3A%20%E2%80%A6%20Svetain%C4%97%3A%20%E2%80%A6

**Trumpai:** HTTP tarp dviejų užklausų nieko neprisimena. PHP sesija tai išsprendžia: PHP suteikia atsitiktinį sesijos ID, siunčia jį naršyklei kaip slapuką ir susijusius duomenis saugo serveryje, pagal numatymą kaip failą. Per kiekvieną tolesnę užklausą `session_start()` pagal ID vėl nuskaito duomenis. Prie PHP sesijos priklauso ir funkcija `session.upload_progress`, kurią php.net dėl PHP2Shell rekomenduoja laikinai išjungti serverio pusėje.

## Kodėl žiniatinklio programoms reikia sesijų

Kiekviena užklausa žiniatinklio serveriui yra atskira. Be papildomo mechanizmo parduotuvė, paspaudus „Krepšelis“, nebežinotų, kas ką ką tik įdėjo, o administravimo sritis kiekvieną paspaudimą reikalautų slaptažodžio. Sesijos atskiras užklausas sujungia į seansą.

Sprendimų priėmėjams tai reiškia: po prisijungimo sesijos ID vertas tiek, kiek naudotojo vardas ir slaptažodis kartu. Administratoriams tai reiškia: kur ir kaip laikomi sesijos duomenys, yra saugumo klausimas, ypač serveriuose su keliomis svetainėmis.

## Kas vyksta per session_start()

Eiga kiekvienai užklausai ta pati ir ją galima aprašyti penkiais žingsniais:

1. Naršyklė siunčia slapuką su sesijos pavadinimu, pagal numatymą `PHPSESSID`.
2. `session_start()` nuskaito ID ir perduoda jį saugojimo tvarkyklei, pagal numatymą `files`.
3. Tvarkyklė įkelia išsaugotus duomenis, PHP paverčia juos atgal per `serialize_handler` ir užpildo `$_SESSION`.
4. Skriptas skaito ir keičia `$_SESSION` kaip įprastą masyvą.
5. Užklausos pabaigoje PHP įrašo duomenis atgal. Su `session.lazy_write` (numatytoji: įjungta) tik tada, kai jie pasikeitė.

```php
<?php
session_start();

$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];
```

Jei sesijos dar nėra, PHP sukuria naują ID ir nustato slapuką. Jei `session.use_strict_mode` aktyvus, PHP atmeta naršyklės pateiktus nežinomus ID ir sukuria naują. PHP vadovas šį nustatymą pagrindiniam saugumui vadina privalomu.

## Numatytosios reikšmės, kurias verta žinoti

Toliau pateiktos reikšmės pagal PHP vadovą galioja, kai nieko kita nesukonfigūruota. Daugelis distribucijų ir hostingo teikėjų nustato savas reikšmes, todėl visada svarbi iš tikrųjų veikianti konfigūracija.

| Nustatymas | Numatytoji | Reikšmė |
|---|---|---|
| `session.save_handler` | `files` | duomenų saugojimo vieta, galimi ir Redis ar duomenų bazė |
| `session.name` | `PHPSESSID` | slapuko pavadinimas |
| `session.serialize_handler` | `php` | išsaugomų duomenų formatas |
| `session.use_strict_mode` | `0` | nežinomi ID priimami |
| `session.use_only_cookies` | `1` | sesijos ID nėra adrese |
| `session.cookie_httponly` | `0` | JavaScript gali skaityti slapuką |
| `session.cookie_secure` | `0` | slapukas ir per nešifruotą HTTP |
| `session.cookie_samesite` | tuščia | nėra SameSite atributo |
| `session.gc_maxlifetime` | `1440` | sekundės iki galimo sutvarkymo |
| `session.gc_probability` / `gc_divisor` | `1` / `100` | sutvarkymas maždaug per kas šimtą paleidimą |
| `session.upload_progress.enabled` | `1` | įkėlimo eiga įrašoma į sesiją |

Taigi `cookie_httponly`, `cookie_secure` ir `use_strict_mode` reikšmės iš gamyklos nėra skirtos saugumui. Kaip jas nustatyti teisingai, aprašo vadovas [Sesijų PHP apsauga](https://phpsos.de/lt/ratgeber/session-sicherheit-php/). Nustatymai `session.sid_length` ir `session.sid_bits_per_character` nuo PHP 8.4.0 pažymėti kaip pasenę.

## Slapukų nustatymas tiesiogiai

Greta sesijos slapuko programa gali nustatyti savus slapukus. Nuo PHP 7.3.0 `setcookie()` tam priima parinkčių masyvą, įskaitant `samesite`. Nuo PHP 8.5.0 papildomai yra parinktis `partitioned`.

```php
<?php
setcookie('sprache', 'de', [
    'expires'  => time() + 60 * 60 * 24 * 30,
    'path'     => '/',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);
```

Pasak vadovo, kai `samesite` lygus `None`, turi būti nustatytas ir `secure`, kitaip naršyklė slapuką blokuoja. Slapukai yra naršyklės duomenys: jų turinys per kitą užklausą grįžta per `$_COOKIE` ir kaip bet kuris kitas įvedimas turi būti tikrinamas. Daugiau puslapyje [Superglobalūs kintamieji](https://phpsos.de/lt/php/superglobals/).

## session.upload_progress: įkėlimų eigos rodymas

PHP failo įkėlimo metu gali įrašyti eigą į sesiją. Tam forma siunčia paslėptą lauką su pavadinimu iš `session.upload_progress.name`, pagal numatymą `PHP_SESSION_UPLOAD_PROGRESS`. Tuomet PHP duomenis `$_SESSION` deda po raktu su priešdėliu `upload_progress_`, su duomenimis, tokiais kaip pradžios laikas, bendras dydis ir jau apdoroti baitai.

Supratimui svarbu: pasak vadovo, PHP šią informaciją į sesiją įrašo prieš įvykdant bet kokį skriptą. Taigi funkcija veikia apdorojant užklausą, dar prieš programos kodą. Jos nustatymai yra tipo `INI_PERDIR` ir vykdymo metu keičiami negali būti.

## Sesijos ir PHP2Shell: pereinamoji priemonė

Kaip vieną iš pereinamųjų priemonių nuo PHP2Shell spragų php.net nurodo nustatyti `session.upload_progress.enabled=0` php.ini, FPM baseine ar serverio konfigūracijoje ir po to iš naujo paleisti visus darbinius procesus, aiškiai ne per `ini_set()` ar `.user.ini`. 2026-10-23 pridėta pastaba dėl [CVE-2026-115560](https://phpsos.de/lt/php2shell/cve-2026-115560/), su ta pačia pagalba iki kito eilinio klaidų taisymo leidimo.

```ini
; svetainės FPM baseinas, po to iš naujo paleisti visus darbinius procesus
php_admin_flag[session.upload_progress.enabled] = off
```

Pasak specialistų ataskaitų, vien šis nustatymas abiejų spragų neuždaro. Privalomas lieka atnaujinimas iki PHP 8.5.12, 8.4.27, 8.3.36 ar 8.2.35. Ar jūsų programa apskritai naudoja įkėlimo eigą ir kaip nustatymą nustatyti ilgalaikiai, aprašo straipsnis [session.upload_progress išjungimas](https://phpsos.de/lt/blog/session-upload-progress-abschalten/).

## Kaip PHP SOS padeda konkrečiai?

- Nuskaitome kiekvienos svetainės iš tikrųjų veikiančius sesijos nustatymus, o ne tik komandinės eilutės reikšmes.
- PHP2Shell pereinamąsias priemones nustatome kiekvienam baseinui, iš naujo paleidžiame visus darbinius procesus ir tikriname rezultatą.
- [Serverio sutvirtinimo](https://phpsos.de/lt/leistungen/server-haertung/) rėmuose atskiriame sesijų saugojimo vietas ir baseinų naudotojus tarp svetainių.
- Po incidento panaikiname visas esamas sesijas, kad pavogti sesijos ID taptų bevertiai.


## Dažni klausimai

**Kuo skiriasi slapukas ir sesija?**  
Slapukas yra mažas duomenų įrašas, kurį naršyklė išsaugo ir siunčia kartu su kiekviena užklausa. Sesija tikruosius duomenis saugo serveryje; slapuke yra tik atsitiktinis identifikatorius, sesijos ID.

**Kiek laiko gyvena PHP sesija?**  
Sesijos slapukas pagal numatymą galioja, kol užveriama naršyklė. Duomenys serveryje gali būti sutvarkyti po session.gc_maxlifetime, pagal numatymą 1440 sekundžių be prieigos. Kada tai iš tikrųjų įvyksta, priklauso nuo sistemos sutvarkymo logikos.

**Ką daro session.upload_progress?**  
Funkcija failo įkėlimo metu įrašo eigą į sesiją, kad antra užklausa galėtų ją parodyti. Pagal numatymą ji aktyvi. Dėl PHP2Shell php.net rekomenduoja ją laikinai išjungti serverio pusėje.

**Ar pakanka session.upload_progress išjungti per ini_set()?**  
Ne. Pasak vadovo, nustatymo vykdymo metu vis tiek pakeisti negalima, o php.net aiškiai kaip teisingas vietas nurodo php.ini, FPM baseiną ar serverio konfigūraciją, o ne ini_set() ar .user.ini. Po to iš naujo paleisti visus darbinius procesus.

## Šaltiniai

- [PHP vadovas: sesijų konfigūracija](https://www.php.net/manual/de/session.configuration.php)
- [PHP vadovas: sesijos įkėlimo eiga](https://www.php.net/manual/de/session.upload-progress.php)
- [PHP vadovas: setcookie](https://www.php.net/manual/en/function.setcookie.php)
- [php.net: saugumo pranešimai](https://www.php.net/)
