# Sesijas un sīkdatnes PHP

> Kā darbojas PHP sesijas un sīkdatnes: sesijas ID, glabāšana, php.ini noklusējuma vērtības, augšupielādes progress un PHP2Shell pagaidu pasākums.

Avots: https://phpsos.de/lv/php/sessions-und-cookies/  
Aktuāls uz: 25.10.2026  
Pakalpojuma sniedzējs: PHP SOS, PHP ārkārtas palīdzība un serveru drošība. Tūlītēja palīdzība pa WhatsApp: https://wa.me/491736494914?text=Sveiki%2C%20PHP%20SOS%2C%20mums%20nepiecie%C5%A1ama%20pal%C4%ABdz%C4%ABba%20ar%20m%C5%ABsu%20PHP%20serveri.%20Uz%C5%86%C4%93mums%3A%20%E2%80%A6%20Vietne%3A%20%E2%80%A6

**Īsi:** HTTP starp diviem pieprasījumiem neko neatceras. PHP sesija to risina: PHP piešķir nejaušu sesijas ID, nosūta to pārlūkprogrammai kā sīkdatni un attiecīgos datus glabā serverī, pēc noklusējuma kā failu. Katrā nākamajā pieprasījumā `session_start()` datus pēc ID nolasa atkal. Pie PHP sesijas pieder arī funkcija `session.upload_progress`, ko php.net PHP2Shell dēļ iesaka uz laiku izslēgt servera pusē.

## Kāpēc tīmekļa lietojumprogrammām vajadzīgas sesijas

Katrs pieprasījums tīmekļa serverim ir patstāvīgs. Bez papildu mehānisma veikals, noklikšķinot uz „Grozs“, vairs nezinātu, kurš tikko kaut ko tajā ielicis, un administratora sadaļa katrā klikšķī prasītu paroli. Sesijas atsevišķus pieprasījumus savieno vienā seansā.

Lēmumu pieņēmējiem tas nozīmē: sesijas ID pēc pieteikšanās ir tikpat vērts kā lietotājvārds un parole kopā. Administratoriem tas nozīmē: kur un kā sesijas dati atrodas, ir drošības jautājums, īpaši serveros ar vairākām vietnēm.

## Kas notiek ar session_start()

Norise katrā pieprasījumā ir vienāda, un to var aprakstīt piecos soļos:

1. Pārlūkprogramma līdzi nosūta sīkdatni ar sesijas nosaukumu, pēc noklusējuma `PHPSESSID`.
2. `session_start()` nolasa ID un nodod to glabāšanas apstrādātājam, pēc noklusējuma `files`.
3. Apstrādātājs ielādē saglabātos datus, PHP tos ar `serialize_handler` pārveido atpakaļ un aizpilda `$_SESSION`.
4. Skripts lasa un maina `$_SESSION` kā parastu masīvu.
5. Pieprasījuma beigās PHP datus ieraksta atpakaļ. Ar `session.lazy_write` (noklusējums: ieslēgts) tikai tad, ja tie ir mainījušies.

```php
<?php
session_start();

$_SESSION['besuche'] = ($_SESSION['besuche'] ?? 0) + 1;
echo 'Seitenaufrufe in dieser Sitzung: ', (int) $_SESSION['besuche'];
```

Ja sesijas vēl nav, PHP izveido jaunu ID un iestata sīkdatni. Ja `session.use_strict_mode` ir aktīvs, PHP noraida no pārlūkprogrammas nākošus nezināmus ID un izveido jaunu. PHP rokasgrāmata šo iestatījumu pamata drošībai raksturo kā obligātu.

## Noklusējuma vērtības, kas jāzina

Turpmākās vērtības saskaņā ar PHP rokasgrāmatu ir spēkā, ja nekas cits nav konfigurēts. Daudzi distributīvi un hostinga sniedzēji iestata savas vērtības, tāpēc vienmēr svarīga ir faktiski spēkā esošā konfigurācija.

| Iestatījums | Noklusējums | Nozīme |
|---|---|---|
| `session.save_handler` | `files` | datu glabāšanas vieta, iespējams arī Redis vai datubāze |
| `session.name` | `PHPSESSID` | sīkdatnes nosaukums |
| `session.serialize_handler` | `php` | saglabāto datu formāts |
| `session.use_strict_mode` | `0` | nezināmi ID tiek pieņemti |
| `session.use_only_cookies` | `1` | sesijas ID nav adresē |
| `session.cookie_httponly` | `0` | JavaScript var nolasīt sīkdatni |
| `session.cookie_secure` | `0` | sīkdatne arī pa nešifrētu HTTP |
| `session.cookie_samesite` | tukšs | nav SameSite atribūta |
| `session.gc_maxlifetime` | `1440` | sekundes līdz iespējamai sakopšanai |
| `session.gc_probability` / `gc_divisor` | `1` / `100` | sakopšana aptuveni katrā simtajā startā |
| `session.upload_progress.enabled` | `1` | augšupielādes progress tiek ierakstīts sesijā |

Vērtības `cookie_httponly`, `cookie_secure` un `use_strict_mode` ir ražotāja iestatījumos tātad nav veidotas drošībai. Kā tās iestatīt pareizi, apraksta ceļvedis [Sesiju aizsardzība PHP](https://phpsos.de/lv/ratgeber/session-sicherheit-php/). Iestatījumi `session.sid_length` un `session.sid_bits_per_character` kopš PHP 8.4.0 ir atzīmēti kā novecojuši.

## Sīkdatņu iestatīšana tieši

Līdzās sesijas sīkdatnei lietojumprogramma var iestatīt savas sīkdatnes. Kopš PHP 7.3.0 `setcookie()` šim nolūkam pieņem masīvu ar opcijām, ieskaitot `samesite`. Kopš PHP 8.5.0 papildus ir opcija `partitioned`.

```php
<?php
setcookie('sprache', 'de', [
    'expires'  => time() + 60 * 60 * 24 * 30,
    'path'     => '/',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);
```

Saskaņā ar rokasgrāmatu, ja `samesite` ir `None`, jāiestata arī `secure`, citādi pārlūkprogramma sīkdatni bloķē. Sīkdatnes ir pārlūkprogrammas dati: to saturs nākamajā pieprasījumā atgriežas caur `$_COOKIE` un jāpārbauda kā jebkura cita ievade. Vairāk lapā [Superglobālie mainīgie](https://phpsos.de/lv/php/superglobals/).

## session.upload_progress: augšupielāžu progresa rādījums

PHP faila augšupielādes laikā var ierakstīt progresu sesijā. Šim nolūkam veidlapa nosūta slēptu lauku ar nosaukumu no `session.upload_progress.name`, pēc noklusējuma `PHP_SESSION_UPLOAD_PROGRESS`. PHP datus pēc tam ievieto `$_SESSION` zem atslēgas ar prefiksu `upload_progress_`, ar norādēm, piemēram, par sākuma laiku, kopējo izmēru un jau apstrādātajiem baitiem.

Svarīgi saprast: saskaņā ar rokasgrāmatu PHP šo informāciju ieraksta sesijā, pirms tiek izpildīts jebkāds skripts. Funkcija tātad darbojas pieprasījuma apstrādes laikā, vēl pirms lietojumprogrammas koda. Tās iestatījumi ir tipa `INI_PERDIR` un izpildes laikā nav maināmi.

## Sesijas un PHP2Shell: pagaidu pasākums

Kā vienu no pagaidu pasākumiem pret PHP2Shell ievainojamībām php.net min `session.upload_progress.enabled=0` iestatīšanu php.ini, FPM pūlā vai servera konfigurācijā un pēc tam visu darbprocesu pārstartēšanu, skaidri nevis ar `ini_set()` vai `.user.ini`. 2026. gada 23. oktobrī klāt nāca norāde par [CVE-2026-115560](https://phpsos.de/lv/php2shell/cve-2026-115560/) ar to pašu risinājumu līdz nākamajam regulārajam kļūdu labojumu izlaidumam.

```ini
; vietnes FPM pūls, pēc tam pārstartēt visus darbprocesus
php_admin_flag[session.upload_progress.enabled] = off
```

Saskaņā ar speciālistu ziņojumiem šis iestatījums vien neaizver abas ievainojamības. Obligāts paliek atjauninājums uz PHP 8.5.12, 8.4.27, 8.3.36 vai 8.2.35. Vai jūsu lietojumprogramma augšupielādes progresu vispār izmanto un kā iestatījumu iestatīt pastāvīgi, apraksta raksts [session.upload_progress izslēgšana](https://phpsos.de/lv/blog/session-upload-progress-abschalten/).

## Kā PHP SOS palīdz konkrēti?

- Mēs katrai vietnei nolasām faktiski spēkā esošos sesiju iestatījumus, nevis tikai komandrindas vērtības.
- Mēs PHP2Shell pagaidu pasākumus iestatām katram pūlam, pārstartējam visus darbprocesus un pārbaudām rezultātu.
- [Servera nostiprināšanas](https://phpsos.de/lv/leistungen/server-haertung/) ietvaros mēs nošķiram sesiju glabāšanas vietas un pūlu lietotājus starp vietnēm.
- Pēc incidenta mēs anulējam visas esošās sesijas, lai nozagti sesiju ID kļūtu bezvērtīgi.


## Biežāk uzdotie jautājumi

**Kāda ir atšķirība starp sīkdatni un sesiju?**  
Sīkdatne ir neliels datu ieraksts, ko pārlūkprogramma saglabā un nosūta līdzi katrā pieprasījumā. Sesija pašus datus glabā serverī; sīkdatnē ir tikai nejaušs identifikators, sesijas ID.

**Cik ilgi dzīvo PHP sesija?**  
Sesijas sīkdatne pēc noklusējuma ir spēkā, līdz pārlūkprogramma tiek aizvērta. Dati serverī drīkst tikt sakopti pēc session.gc_maxlifetime, pēc noklusējuma 1440 sekundēm bez piekļuves. Kad tas patiešām notiek, atkarīgs no sistēmas sakopšanas loģikas.

**Ko dara session.upload_progress?**  
Funkcija faila augšupielādes laikā ieraksta progresu sesijā, lai otrs pieprasījums to varētu parādīt. Pēc noklusējuma tā ir aktīva. PHP2Shell dēļ php.net iesaka to uz laiku izslēgt servera pusē.

**Vai pietiek ar session.upload_progress izslēgšanu ar ini_set()?**  
Nē. Iestatījumu saskaņā ar rokasgrāmatu tāpat nevar mainīt izpildes laikā, un php.net kā pareizās vietas skaidri min php.ini, FPM pūlu vai servera konfigurāciju, nevis ini_set() vai .user.ini. Pēc tam pārstartējiet visus darbprocesus.

## Avoti

- [PHP rokasgrāmata: sesiju konfigurācija](https://www.php.net/manual/de/session.configuration.php)
- [PHP rokasgrāmata: sesijas augšupielādes progress](https://www.php.net/manual/de/session.upload-progress.php)
- [PHP rokasgrāmata: setcookie](https://www.php.net/manual/en/function.setcookie.php)
- [php.net: drošības paziņojumi](https://www.php.net/)
