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 →

Drošības koda pārskats PHP projektiem

Kā komandas mērķtiecīgi caurskata savu PHP kodu uz drošības nepilnībām: pārskatu veidi, kritiskās funkcijas, lietderīgi rīki un pārbaudes saraksts.

Aktuāls uz 4 min lasīšanas laiksDroša izstrāde

Īsi sakot: Drošības koda pārskats PHP ir mērķtiecīga pirmkoda lasīšana ar vienu jautājumu: kur svešas ievades var izdarīt to, ko tās nedrīkst? Pierādījušās ir divas formas: katras izmaiņas pārskats un viss projekta pamatpārskats, balstoties uz statisko analīzi ar PHPStan vai Psalm. Ievainojamības PHP interpretatorā, piemēram, PHP2Shell, pārskats neatrod, bet atrod daudzās kļūdas, kas rodas pašu kodā.

Kāpēc tieši tagad skatīties savā kodā?

PHP2Shell 2026. gada oktobra pēdējā nedēļā galvenokārt nodarbināja administratorus. Ielāpot, pārstartēt, pierādīt: darbs bija serverī. Izstrādes komandām pēc tam paliek neērts jautājums. Ja uzbrucējs caur citu ievainojamību var izpildīt kodu, ko viņš atrod mūsu lietojumprogrammā? Un cik šo ievainojamību mēs paši esam uzrakstījuši?

OWASP Top 10 jau gadiem rāda, ka lielākā daļa tīmekļa lietojumprogrammu vājo vietu nav eksotiskas. Trūkstoša piekļuves kontrole, injekcija un nedroša konfigurācija ir augstu sarakstā. Tās ir kļūdas, ko pieredzējis skatiens pirmkodā atrod ilgi pirms uzbrucējs tās izmēģina.

Klāt nāk praktisks iemesls. Daudzi uzņēmumi tieši tagad tāpat pārbauda, ielāpo un nostiprina savus serverus. Kas savu lietojumprogrammu apskata vienlaikus, aizver plaisu starp darbību un izstrādi. Nostiprināts serveris ar ievainojamu lietojumprogrammu paliek uzbrūkams, un tāpat pareizi uzrakstīta lietojumprogramma uz neielāpota PHP.

Pamatpārskats vai izmaiņu pārskats?

OWASP Cheat Sheet par Secure Code Review izšķir divus veidus, kas praksē papildina viens otru:

Veids Kad Apjoms Mērķis
Pamatpārskats (Baseline) jauns projekts, liels izlaidums, pēc incidenta viss projekts, svērts pēc riska apkopot ievainojamību sastāvu
Izmaiņu pārskats (Diff) katrs pull request tikai mainītais kods novērst jaunas kļūdas

Pamatpārskats pēc incidenta ir īpaši vērtīgs. Kas tikko ir sakopis serveri, tam jāzina, vai lietojumprogramma piedāvā vēl citus ieejas punktus. Izmaiņu pārskats pēc tam uztur kārtību, jo katra izmaiņa pirms sapludināšanas tiek lasīta arī no drošības viedokļa.

Koda pārskats PHP: kur drošības kļūdas uzkrājas

PHP projektos vērts mērķtiecīgi apskatīt noteiktas funkcijas un paraugus. Tās nav aizliegtas, bet katram atradumam der jautājums, vai tajā var nonākt svešie dati.

Paraugs kodā Iespējamais risks Padziļinājums
SQL ar virkņu apvienošanu ar mainīgajiem SQL injekcija SQL injekcijas novēršana PHP
unserialize() datiem no ārpuses objektu injekcija Nedroša deserializācija PHP
include vai require ar mainīgu ceļu svešu failu iekļaušana Local un Remote File Inclusion novēršana
exec(), system(), shell_exec(), proc_open() komandu izpilde Command Injection
Izvade bez htmlspecialchars() Cross-Site Scripting kontekstam atbilstoša maskēšana
== tokeniem vai jaucējkodiem tipu pārveide apiet pārbaudes hash_equals(), stingri salīdzinājumi
eval(), extract() ievadei koda vai mainīgo injekcija parasti svītrot bez aizstājēja

Ātru pirmo pārskatu iegūst ar vienkāršu meklēšanu. Tā pārskatu neaizstāj, bet parāda, ar ko sākt:

# Riskanto funkciju atradumi savā kodā (vendor izslēgts)
grep -rnE "\b(unserialize|eval|extract|shell_exec|exec|system|passthru|proc_open)\s*\(" src/ app/ 2>/dev/null

Vismaz tikpat svarīgi ir tas, kā kodā trūkst. Vai katrs kontrolieris pārbauda, vai pieteiktais lietotājs drīkst redzēt vai mainīt tieši šo ierakstu? Vai augšupielādes tiek ierobežotas pēc tipa un glabāšanas vietas? Šādas nepilnības neatrod neviena funkciju nosaukumu meklēšana, tikai procesa lasīšana.

Rīki, kas pārskatu nes

Statiskā analīze pārbauda kodu, to neizpildot. PHPStan un Psalm atrod tipu kļūdas, nesasniedzamu kodu un nepareizus pieņēmumus par atgriežamajām vērtībām. Psalm papildus piedāvā Taint analīzi, kas seko, vai dati no pieprasījumiem nepārbaudīti plūst uz kritiskām vietām. Abus var stingrināt pa līmeņiem, lai iesaistīties var arī vecāki projekti. Pārskatu sniedz Statiskā analīze: PHPStan un Psalm.

# Statiskā analīze projektā, līmeni paaugstināt pakāpeniski
vendor/bin/phpstan analyse src --level=5
# Taint analīze ar Psalm
vendor/bin/psalm --taint-analysis

Rīki dod norādes, nevis spriedumus. Katram trāpījumam vajadzīgs novērtējums, un tukšs ziņojums nenozīmē, ka lietojumprogramma ir droša.

Tikpat svarīgi kā atrašana ir fiksēšana. Katrs konstatējums jāreģistrē ar atrašanās vietu, īsu aprakstu, riska novērtējumu, ieteicamo novēršanu un statusu, vislabāk tieši komandas biļešu sistēmā. Tā var izsekot, kas novērsts, kas apzināti pieņemts un kas vēl atvērts. Pēc novēršanas vērts apskatīties otrreiz: vai cēlonis ir novērsts vai tikai viens simptoms? Vai tas pats paraugs parādās citās kodā vietās? Kļūda, kas reiz izdarīta, pēc pieredzes reti slēpjas tikai vienā vietā.

Pārbaudes saraksts savai komandai

Izmaiņu pārskatiem pierādījies īss, fiksēts saraksts. Tas pieder pull request veidnei:

  1. No kurienes nāk visi dati, ko šī izmaiņa apstrādā, un vai tie tiek pārbaudīti servera pusē?
  2. Vai datubāzes vaicājumi tiek veidoti tikai ar vietturiem?
  3. Vai katra izvade ir maskēta savam kontekstam, tātad HTML, atribūtam, JavaScript vai URL?
  4. Vai kods pārbauda atļauju tieši šim objektam, nevis tikai pieteikšanos?
  5. Vai paroles, tokeni vai personas dati nonāk žurnālos vai kļūdu ziņojumos?
  6. Vai noslēpumi atrodas kodā vai versiju kontrolētos failos?
  7. Vai tika pievienotas jaunas atkarības un vai tās tiek uzturētas?
Padoms

Drošībai kritiskās daļas, piemēram, pieteikšanos, tiesību pārvaldību, maksājumu procesus un augšupielādes, vienmēr ļaujiet izlasīt otrai personai, kas nav piedalījusies kodā. Svešs skatiens atrod pieņēmumus, ko autors uzskata par pašsaprotamiem.

Kā PHP SOS palīdz konkrēti?

  • Mēs kopā ar specializētiem partneriem veicam jūsu PHP lietojumprogrammas pamatpārskatu, svērtu pēc daļām ar augstāko risku.
  • Mēs iestatām PHPStan vai Psalm atbilstoši jūsu projekta stāvoklim un uzrakstām pārbaudes sarakstu jūsu pull request.
  • Mēs savienojam pārskatu ar skatienu uz serveri un konfigurāciju, jo daudzas ievainojamības rodas tikai mijiedarbībā.
  • Kur vēlama pārbaude no ārpuses, mēs pārskatu papildinām ar drošības auditu un penetrācijas testu.

Secinājums: Koda pārskats ir lētākā vieta drošības kļūdu novēršanai, proti, pirms tās tiek piegādātas. Kas katru izmaiņu pārbauda ar īsu sarakstu un reizēm projektu apskata pilnībā, tas pastāvīgi samazina uzbrukuma virsmu.

Biežāk uzdotie jautājumi

Kāda ir atšķirība starp koda pārskatu un penetrācijas testu?

Koda pārskats lasa pirmkodu un atrod kļūdas, pirms tās tiek piegādātas. Penetrācijas tests uzbrūk darbojošajai lietojumprogrammai no ārpuses. Abi papildina viens otru: pārskats atrod cēloņus, tests parāda, kas tiešām ir izmantojams.

Vai koda pārskats atrod tādas ievainojamības kā PHP2Shell?

Nē. PHP2Shell ir PHP interpretatorā, nevis lietojumprogrammas kodā. Pret to palīdz tikai PHP atjauninājums ar pārstartēšanu. Pārskats atrod kļūdas savā kodā, piemēram, injekciju, trūkstošas atļauju pārbaudes vai nedrošu deserializāciju.

Vai ar PHPStan vai Psalm pietiek drošības pārskatam?

Tie ir laba bāze un automātiski atrod daudzas kļūdas. Loģikas kļūdas, trūkstošas atļauju pārbaudes un nepareizus pieņēmumus par procesiem tomēr atpazīst tikai cilvēks, kas zina, ko lietojumprogrammai jādara.

Cik ilgi ilgst drošības koda pārskats?

Tas atkarīgs no apjoma. Katras izmaiņas pārskats pull request prasa maz laika. Izaugušā projekta pilns pārskats ir atsevišķs darbs, ko pēc riska ierobežo līdz svarīgākajām daļām.

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