Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

Sesijas un sīkdatnes PHP

Sesijas no bezstāvokļa HTTP izveido pieteikšanos, kas turas vairākās lapās. Kā PHP to risina iekšēji, kādas ir noklusējuma vērtības un kāds sakars session.upload_progress ir ar PHP2Shell.

Aktuāls uz 4 min lasīšanas laiksPHP zināšanas

Ī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
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.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība