Īsi: statiskā analīze pārbauda PHP kodu, to neizpildot, un tā atrod tipu kļūdas, nedefinētus mainīgos, mirušu kodu un izsaukumus uz iespējami tukšām vērtībām. Divi plaši izplatīti rīki ir PHPStan (noteikumu līmeņi no 0 līdz 10) un Psalm (kļūdu līmeņi no 1 līdz 8, bez tam taint analīze nedrošām datu plūsmām). Tie atrod kļūdas jūsu lietojumprogrammā, nevis PHP interpretatorā; pret ievainojamībām, piemēram, PHP2Shell, palīdz tikai PHP atjauninājums.
Kas ir statiskā analīze?
Tests izpilda kodu un salīdzina rezultātu. Statiskā analīze turpretī lasa kodu kā ļoti rūpīgs pārbaudītājs un no tipiem, atgriežamajām vērtībām un izsaukumiem secina, kur kas var noiet greizi. Tā atrod kļūdas arī zaros, ko neviens tests nekad nesasniedz.
Lēmumu pieņēmējiem ieguvums ir vienkāršs: kļūdas, kas atrastas pirms palaišanas darbībā, maksā daļu no tām, ko pamana klienti. Izstrādātājiem tā ir pastāvīgs pavadonis, kas darbojas izstrādes vidē un CI konveijerā. Ja analīze pie izmaiņas rada trauksmi, izmaiņa netiek pieņemta, kamēr kļūda nav novērsta. Tā jauns mantotais slogs neuzkrājas, kamēr esošais tiek pakāpeniski samazināts. Kopā ar testiem ar PHPUnit un Pest tā veido koda kvalitātes pamatu.
PHPStan: noteikumu līmeņi no 0 līdz 10
PHPStan instalē kā izstrādes atkarību, un darbībai tam vajadzīgs PHP no 7.4:
composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src tests
Bez papildu norādes PHPStan pārbauda tikai nepieciešamāko. Stingrību vada ar vienpadsmit līmeņiem, katrs ietver zemāk esošos:
| Līmenis | Kas papildus tiek pārbaudīts (izlase) |
|---|---|
| 0 | nezināmas klases un funkcijas, nepareizs argumentu skaits, vienmēr nedefinēti mainīgie |
| 3 | atgriežamie tipi un tipi, kas tiek piešķirti īpašībām |
| 5 | argumentu tipi funkciju un metožu izsaukumos |
| 6 | trūkstošas tipu norādes |
| 8 | metožu izsaukumi un īpašību piekļuves vērtībām, kas var būt null |
| 10 | stingrākā attieksme pret mixed, arī trūkstošiem tipiem |
Ar --level max vienmēr darbojas augstākais līmenis. Dokumentācija gan brīdina, ka PHPStan jauninājums tad var nest daudz jaunu ziņojumu. Tipisks atradums no 8. līmeņa:
<?php
function kundenname(?Kunde $kunde): string
{
return $kunde->name(); // PHPStan: izsaukums uz vērtību, kas var būt null
}
PHPStan ieviešana bez kļūdu plūdiem: baseline
Izaugušos projektos PHPStan augstā līmenī bieži ziņo par simtiem vietu. Baseline šo problēmu atrisina: tā visus esošos ziņojumus saglabā failā, un PHPStan no tā brīža ziņo tikai par jaunām kļūdām.
vendor/bin/phpstan analyse --level 6 src tests --generate-baseline
Izveidoto failu phpstan-baseline.neon iekļaujat konfigurācijā:
includes:
- phpstan-baseline.neon
parameters:
level: 6
paths:
- src
- tests
Tā esošais slogs paliek redzami dokumentēts, savukārt jaunajam kodam no paša sākuma jābūt tīram.
Psalm un taint analīze
Psalm tiecas uz līdzīgiem mērķiem kā PHPStan. Līmeņi iet pretēji: 1 ir stingrākais, 8 saudzīgākais, noklusējums ir 2. Psalm vajadzīgs PHP no 8.2, un to iestata šādi:
composer require --dev vimeo/psalm
./vendor/bin/psalm --init
./vendor/bin/psalm --taint-analysis
Taint analīze drošībai ir īpaši interesanta. „Taint“ nozīmē piesārņojums: Psalm atzīmē datus no avotiem, ko uzbrucējs var kontrolēt, piemēram, $_GET, $_POST, $_COOKIE, $_REQUEST vai php://input. Pēc tam tas izseko, vai šie dati nonāk neaizsargāti bīstamās vietās, tā sauktajās noteces vietās (sinks): izvadē ar echo, include, header vai SQL vaicājumos. Pie iebūvētajām kategorijām cita starpā pieder sql, html, shell, include, eval, ssrf un unserialize.
<?php
// Psalm ziņo par plūsmu no $_GET uz HTML izvadi (kategorija html)
echo 'Hallo ' . $_GET['name'];
// Novērsts: izvadi maskēt atbilstoši kontekstam
echo 'Hallo ' . htmlspecialchars($_GET['name'] ?? '', ENT_QUOTES, 'UTF-8');
Psalm dokumentācija robežas min atklāti: analīze pieņem, ka maskēšana notiek pareizi. Smalkas kļūdas, piemēram, trūkstošas pēdiņas ap HTML atribūtu, tomēr var atstāt ievainojamības. Tāpēc Psalm iesaka parametrizētus vaicājumus SQL un kontekstu apzinošas veidnes HTML. Rezultātus var izvadīt SARIF formātā, ko cita starpā saprot GitHub Code Scanning.
Statiskā analīze un drošība pēc PHP2Shell
Šeit vērts godīgi norobežot. PHP2Shell, tas ir, CVE-2026-109618 un CVE-2026-109619, atrodas PHP interpretatorā. Neviens rīks, kas lasa jūsu lietojumprogrammas kodu, šīs ievainojamības neatrod, un neviena koda izmaiņa tās neaizver. To spēj tikai atjauninājums uz PHP 8.5.12, 8.4.27, 8.3.36 vai 8.2.35.
Tomēr statiskā analīze drošībai palīdz trijās vietās:
- Jauninājuma spēja: tā atrod kodu, kas jaunās PHP versijās vairs nedarbojas. Tā samazinās slieksnis pārejai no 8.1 vai 8.2 uz atbalstītu versiju.
- Paša ievainojamības: taint analīze atrod ceļus SQL injekcijai, Cross-Site Scripting vai failu iekļaušanai. PHP projekts savā drošības politikā precizē, ka nepārbaudīta ievade funkcijām, piemēram,
mysqli_query(), nav PHP kļūda, bet lietojumprogrammas atbildība. - Noturība: daudzas fatālas kļūdas rodas no izsaukumiem uz null vai nepareiziem tipiem. php.net saistībā ar CVE-2026-109619 skaidri iesaka lietojumprogrammā novērst no ārpuses izraisāmas fatālas kļūdas.
Statiskā analīze neaizstāj cilvēka veiktu drošības koda pārskatu, bet padara to efektīvāku, jo ierastās kļūdas jau iepriekš ir atsijātas.
Kā PHP SOS palīdz konkrēti?
Drošības audita un penetrācijas testa ietvaros mēs rīkojamies šādi:
- Iestatīt rīkus: PHPStan vai Psalm ar piemērotu līmeni un baseline, iekļauti jūsu esošajā konveijerā.
- Izvērtēt drošības atradumus: mēs pārbaudām taint analīzes rezultātus un atdalām īstus riskus no viltus trauksmēm.
- Sagatavot jauninājumu: mēs parādām, kuras vietas bloķē pāreju uz atbalstītu PHP versiju.
- Nodot rezultātus: jūs saņemat prioritizētu sarakstu ar konkrētām koda vietām jūsu komandai vai aģentūrai.
Biežāk uzdotie jautājumi
Kāda ir atšķirība starp PHPStan un Psalm?
Abi pārbauda tipus un atrod kļūdas bez izpildes. PHPStan savus līmeņus skaita no 0 (brīvs) līdz 10 (stingrs), Psalm no 8 (brīvs) līdz 1 (stingrs). Psalm ir iebūvēta taint analīze drošības problēmām.
Vai PHPStan var ieviest vecā projektā?
Jā. Ar baseline PHPStan visus esošos ziņojumus saglabā failā un pēc tam ziņo tikai par jaunām kļūdām. Tā komanda sāk bez kļūdu plūdiem un pakāpeniski noņem mantoto slogu.
Vai statiskā analīze atrod PHP2Shell?
Nē. PHP2Shell atrodas PHP interpretatorā, nevis jūsu kodā. Pret to palīdz tikai PHP atjauninājums. Taču statiskā analīze palīdz sagatavot kodu jaunām PHP versijām, lai atjauninājums būtu iespējams ātrāk.
Kādu līmeni izvēlēties?
Sākumam zemu līmeni bez baseline vai augstāku līmeni ar baseline. Svarīgāks par skaitli ir tas, lai analīze darbotos automātiski pie katras izmaiņas un neielaistu jaunas kļūdas.