Ī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:
- Pārlūkprogramma līdzi nosūta sīkdatni ar sesijas nosaukumu, pēc noklusējuma
PHPSESSID. session_start()nolasa ID un nodod to glabāšanas apstrādātājam, pēc noklusējumafiles.- Apstrādātājs ielādē saglabātos datus, PHP tos ar
serialize_handlerpārveido atpakaļ un aizpilda$_SESSION. - Skripts lasa un maina
$_SESSIONkā parastu masīvu. - 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
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. 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
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.
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 ar to pašu risinājumu līdz nākamajam regulārajam kļūdu labojumu izlaidumam.
; 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.
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 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.