# Sessioonid ja küpsised PHP-s

> Kuidas PHP sessioonid ja küpsised töötavad: sessiooni ID, salvestus, php.ini vaikeväärtused, üleslaadimise edenemine ja PHP2Shelli ajutine meede.

Allikas: https://phpsos.de/et/php/sessions-und-cookies/  
Seis: 25.10.2026  
Pakkuja: PHP SOS, PHP hädaabi ja serveri turvalisus. Kohene abi WhatsAppis: https://wa.me/491736494914?text=Tere%2C%20PHP%20SOS%2C%20vajame%20abi%20oma%20PHP-serveriga.%20Ettev%C3%B5te%3A%20%E2%80%A6%20Veebisait%3A%20%E2%80%A6

**Lühidalt:** HTTP ei mäleta kahe päringu vahel midagi. PHP sessioon lahendab selle: PHP annab juhusliku sessiooni ID, saadab selle küpsisena brauserile ja salvestab kuuluvad andmed serveris, vaikimisi failina. Igal järgmisel päringul loeb `session_start()` andmed ID järgi uuesti sisse. PHP sessiooni juurde kuulub ka funktsioon `session.upload_progress`, mille php.net soovitab PHP2Shelli tõttu ajutiselt serveri poolel välja lülitada.

## Miks veebirakendused sessioone vajavad

Iga päring veebiserverile on omaette. Ilma lisamehhanismita ei teaks pood „Ostukorv“ klõpsamisel enam, kes just midagi sinna pani, ja admin-ala peaks igal klõpsul parooli küsima. Sessioonid ühendavad üksikud päringud seansiks.

Otsustajale tähendab see: sessiooni ID on pärast sisselogimist sama palju väärt kui kasutajanimi ja parool kokku. Administraatoritele tähendab see: kus ja kuidas sessiooniandmed asuvad, on turvaküsimus, eriti mitme veebisaidiga serverites.

## Mis juhtub funktsiooniga session_start()

Kulg on igal päringul sama ja seda saab kirjeldada viies sammus:

1. Brauser saadab kaasa sessiooni nimega küpsise, vaikimisi `PHPSESSID`.
2. `session_start()` loeb ID ja annab selle salvestuskäsitlejale, vaikimisi `files`.
3. Käsitleja laadib salvestatud andmed, PHP muudab need `serialize_handler` abil tagasi ja täidab `$_SESSION`.
4. Skript loeb ja muudab `$_SESSION` nagu tavalist massiivi.
5. Päringu lõpus kirjutab PHP andmed tagasi. Sättega `session.lazy_write` (vaikimisi: sees) ainult siis, kui need on muutunud.

```php
<?php
session_start();

$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];
```

Kui sessiooni veel ei ole, loob PHP uue ID ja seab küpsise. Kui `session.use_strict_mode` on aktiivne, lükkab PHP brauseri poolt ette antud tundmatud ID-d tagasi ja loob uue. PHP käsiraamat nimetab seda sätet põhiturvalisuse jaoks kohustuslikuks.

## Vaikeväärtused, mida tasub teada

Järgmised väärtused kehtivad PHP käsiraamatu järgi, kui midagi muud ei ole seadistatud. Paljud distributsioonid ja veebimajutajad seavad omad väärtused, seetõttu loeb alati tegelikult mõjus seadistus.

| Säte | Vaikeväärtus | Tähendus |
|---|---|---|
| `session.save_handler` | `files` | andmete asukoht, võimalikud ka Redis või andmebaas |
| `session.name` | `PHPSESSID` | küpsise nimi |
| `session.serialize_handler` | `php` | salvestatud andmete vorming |
| `session.use_strict_mode` | `0` | tundmatud ID-d võetakse üle |
| `session.use_only_cookies` | `1` | sessiooni ID ei ole aadressis |
| `session.cookie_httponly` | `0` | JavaScript saab küpsist lugeda |
| `session.cookie_secure` | `0` | küpsis ka krüpteerimata HTTP kaudu |
| `session.cookie_samesite` | tühi | SameSite atribuuti ei ole |
| `session.gc_maxlifetime` | `1440` | sekundid võimaliku koristamiseni |
| `session.gc_probability` / `gc_divisor` | `1` / `100` | koristamine umbes igal sajandal käivitamisel |
| `session.upload_progress.enabled` | `1` | üleslaadimise edenemine kirjutatakse sessiooni |

Väärtused `cookie_httponly`, `cookie_secure` ja `use_strict_mode` ei ole seega tehasest turvalisuse jaoks mõeldud. Kuidas neid õigesti seada, kirjeldab juhend [Sessioonide kaitsmine PHP-s](https://phpsos.de/et/ratgeber/session-sicherheit-php/). Sätted `session.sid_length` ja `session.sid_bits_per_character` on alates PHP 8.4.0-st märgitud vananenuks.

## Küpsiste otse seadmine

Sessiooniküpsise kõrval võib rakendus seada omi küpsiseid. Alates PHP 7.3.0-st võtab `setcookie()` selleks vastu valikutega massiivi, kaasa arvatud `samesite`. Alates PHP 8.5.0-st on lisaks valik `partitioned`.

```php
<?php
setcookie('sprache', 'de', [
    'expires'  => time() + 60 * 60 * 24 * 30,
    'path'     => '/',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);
```

Käsiraamatu järgi peab `samesite` väärtuse `None` korral olema seatud ka `secure`, muidu blokeerib brauser küpsise. Küpsised on brauseri andmed: nende sisu tuleb järgmisel päringul tagasi `$_COOKIE` kaudu ja seda tuleb nagu iga muud sisendit kontrollida. Lisateavet lehel [Superglobaalid](https://phpsos.de/et/php/superglobals/).

## session.upload_progress: üleslaadimiste edenemisnäit

PHP saab faili üleslaadimise ajal edenemise sessiooni kirjutada. Selleks saadab vorm peidetud välja nimega `session.upload_progress.name` sättest, vaikimisi `PHP_SESSION_UPLOAD_PROGRESS`. PHP paneb andmed seejärel `$_SESSION` võtme alla eesliitega `upload_progress_`, andmetega nagu algusaeg, kogusuurus ja juba töödeldud baidid.

Mõistmiseks on oluline: käsiraamatu järgi kirjutab PHP selle teabe sessiooni enne, kui ükski skript käivitub. Funktsioon töötab seega päringu töötlemise ajal, veel enne rakenduse koodi. Selle sätted on tüüpi `INI_PERDIR` ja neid ei saa käitusajal muuta.

## Sessioonid ja PHP2Shell: ajutine meede

Ühe PHP2Shelli aukude vastase ajutise meetmena nimetab php.net, et `session.upload_progress.enabled=0` tuleb seada failis php.ini, FPM-poolis või serveri seadistuses ja seejärel kõik workerid uuesti käivitada, selgesõnaliselt mitte `ini_set()` ega `.user.ini` kaudu. 23.10.2026 lisandus märkus [CVE-2026-115560](https://phpsos.de/et/php2shell/cve-2026-115560/) kohta, sama abinõuga kuni järgmise tavapärase veaparanduse väljalaskeni.

```ini
; saidi FPM-pool, seejärel kõik workerid uuesti käivitada
php_admin_flag[session.upload_progress.enabled] = off
```

Erialaaruannete järgi ei sulge see säte üksi mõlemat auku. Kohustuslikuks jääb uuendus versioonile PHP 8.5.12, 8.4.27, 8.3.36 või 8.2.35. Kas teie rakendus üleslaadimise edenemist üldse kasutab ja kuidas sätet püsivalt seada, kirjeldab artikkel [session.upload_progress väljalülitamine](https://phpsos.de/et/blog/session-upload-progress-abschalten/).

## Kuidas PHP SOS konkreetselt aitab?

- Loeme veebisaidi kohta välja tegelikult mõjusad sessioonisätted, mitte ainult käsurea väärtused.
- Seame PHP2Shelli ajutised meetmed pooli kaupa, käivitame kõik workerid uuesti ja kontrollime tulemust.
- Eraldame sessioonide asukohad ja pooli kasutajad veebisaitide vahel [serveri karastamise](https://phpsos.de/et/leistungen/server-haertung/) raames.
- Pärast intsidenti tühistame kõik olemasolevad seansid, et varastatud sessiooni ID-d muutuksid väärtusetuks.


## Korduma kippuvad küsimused

**Mis vahe on küpsisel ja sessioonil?**  
Küpsis on väike andmekirje, mille brauser salvestab ja igal päringul kaasa saadab. Sessioon salvestab tegelikud andmed serveris; küpsises on ainult juhuslik tunnus, sessiooni ID.

**Kui kaua PHP sessioon elab?**  
Sessiooniküpsis kehtib vaikimisi, kuni brauser suletakse. Serveris olevaid andmeid tohib koristada pärast session.gc_maxlifetime, vaikimisi 1440 sekundit ilma ligipääsuta. Millal see tegelikult juhtub, sõltub süsteemi koristusloogikast.

**Mida session.upload_progress teeb?**  
Funktsioon kirjutab faili üleslaadimise ajal edenemise sessiooni, et teine päring saaks seda kuvada. See on vaikimisi aktiivne. PHP2Shelli tõttu soovitab php.net seda ajutiselt serveri poolel välja lülitada.

**Kas piisab session.upload_progress'i väljalülitamisest ini_set() abil?**  
Ei. Sätet ei saa käsiraamatu järgi nagunii käitusajal muuta ja php.net nimetab õigete kohtadena selgesõnaliselt php.ini, FPM-pooli või serveri seadistust, mitte ini_set() ega .user.ini. Seejärel kõik workerid uuesti käivitada.

## Allikad

- [PHP käsiraamat: sessiooni seadistus](https://www.php.net/manual/de/session.configuration.php)
- [PHP käsiraamat: sessiooni üleslaadimise edenemine](https://www.php.net/manual/de/session.upload-progress.php)
- [PHP käsiraamat: setcookie](https://www.php.net/manual/en/function.setcookie.php)
- [php.net: turvateated](https://www.php.net/)
