Praegune olukord: PHP2Shell. Kaks kriitilist PHP turvaauku (CVSS 9,2) lubavad kahjulikku koodi ilma sisselogimata. Paigad alates 21.10.2026.Mida nüüd teha →

Staatiline analüüs: PHPStan ja Psalm

PHPStan ja Psalm leiavad PHP koodist vigu, seda käivitamata. Psalm jälgib lisaks ebaturvalisi andmevooge. PHP interpretaatori enda turvauke ei leia kumbki.

Seis Lugemisaeg 4 minPHP teadmised

Lühidalt: Staatiline analüüs kontrollib PHP koodi seda käivitamata ja leiab nii tüübivigu, defineerimata muutujaid, surnud koodi ja väljakutseid võimalikult tühjadele väärtustele. Kaks levinud vahendit on PHPStan (reeglitasemed 0–10) ja Psalm (veatasemed 1–8, lisaks taint-analüüs ebaturvaliste andmevoogude jaoks). Nad leiavad vigu teie rakenduses, mitte PHP interpretaatoris; turvaaukude nagu PHP2Shell vastu aitab ainult PHP uuendus.

Mis on staatiline analüüs?

Test käivitab koodi ja võrdleb tulemust. Staatiline analüüs loeb koodi seevastu nagu väga põhjalik kontrollija ning järeldab tüüpidest, tagastusväärtustest ja väljakutsetest, kus midagi võib viltu minna. See leiab vigu ka harudes, milleni ükski test kunagi ei jõua.

Otsustajale on kasu lihtne: vead, mis leitakse enne live'i minekut, maksavad murdosa sellest, mis maksavad vead, mida kliendid märkavad. Arendajatele on see püsiv kaaslane, mis töötab kaasa arenduskeskkonnas ja CI-torujuhtmes. Kui analüüs muudatuse korral annab märku, ei võeta seda vastu, kuni viga on parandatud. Nii ei kasva uut vanavara, samal ajal kui olemasolevat järk-järgult vähendatakse. Koos PHPUnit'i ja Pestiga testimisega moodustab see koodikvaliteedi vundamendi.

PHPStan: reeglitasemed 0-st 10-ni

PHPStan paigaldatakse arendussõltuvusena ja vajab töötamiseks PHP-d alates 7.4:

composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src tests

Lisamärketa kontrollib PHPStan ainult kõige vajalikumat. Rangust juhite üheteistkümne tasemega, igaüks hõlmab allpool olevaid:

Tase Mida lisaks kontrollitakse (valik)
0 tundmatud klassid ja funktsioonid, vale arv argumente, alati defineerimata muutujad
3 tagastustüübid ja tüübid, mis omadustele omistatakse
5 argumentide tüübid funktsiooni- ja meetodikutsetes
6 puuduvad tüübimärked
8 meetodikutsed ja omadustele ligipääs väärtustel, mis võivad olla null
10 kõige rangem käsitlus tüübiga mixed, ka puuduvate tüüpide korral

Valikuga --level max jookseb alati kõrgeim tase. Dokumentatsioon hoiatab siiski, et PHPStani uuendus võib siis tuua palju uusi teateid. Tüüpiline leid alates tasemest 8:

<?php
function kundenname(?Kunde $kunde): string
{
    return $kunde->name();   // PHPStan: väljakutse väärtusel, mis võib olla null
}

PHPStani kasutuselevõtt ilma vigade uputuseta: baseline

Kasvanud projektides teatab PHPStan kõrgel tasemel sageli sadadest kohtadest. Baseline lahendab probleemi: see salvestab kõik olemasolevad teated faili ja PHPStan teatab sestsaadik ainult uutest vigadest.

vendor/bin/phpstan analyse --level 6 src tests --generate-baseline

Loodud faili phpstan-baseline.neon ühendate seadistusega:

includes:
    - phpstan-baseline.neon

parameters:
    level: 6
    paths:
        - src
        - tests

Nii jääb vana kraam nähtavalt dokumenteerituks, samal ajal kui uus kood peab algusest peale puhas olema.

Psalm ja taint-analüüs

Psalm taotleb sarnaseid eesmärke nagu PHPStan. Tasemed jooksevad vastupidi: 1 on kõige rangem, 8 kõige leebem, vaikimisi on 2. Psalm vajab PHP-d alates 8.2 ja seadistatakse nii:

composer require --dev vimeo/psalm
./vendor/bin/psalm --init
./vendor/bin/psalm --taint-analysis

Taint-analüüs on turvalisuse seisukohast eriti huvitav. „Taint“ tähendab rüvetust: Psalm märgib andmed allikatest, mida ründaja saab kontrollida, näiteks $_GET, $_POST, $_COOKIE, $_REQUEST või php://input. Seejärel jälgib see, kas need andmed jõuavad kaitsmata ohtlikesse kohtadesse, nn neeldajatesse (sink): väljund käsuga echo, include, header või SQL-päringud. Sisseehitatud kategooriate hulka kuuluvad muu hulgas sql, html, shell, include, eval, ssrf ja unserialize.

<?php
// Psalm teatab voost $_GET-ist HTML-väljundisse (kategooria html)
echo 'Hallo ' . $_GET['name'];

// Parandatud: väljund kontekstile vastavalt maskeerida
echo 'Hallo ' . htmlspecialchars($_GET['name'] ?? '', ENT_QUOTES, 'UTF-8');

Psalmi dokumentatsioon nimetab piirid avalikult: analüüs eeldab, et maskeerimine toimub õigesti. Peened vead, näiteks HTML-atribuudi ümbert puuduvad jutumärgid, võivad siiski jätta auke. Psalm soovitab seetõttu SQL-i jaoks parametriseeritud päringuid ja HTML-i jaoks kontekstitundlikke malle. Tulemusi saab väljastada SARIF-vormingus, millest saab aru muu hulgas GitHub Code Scanning.

Staatiline analüüs ja turvalisus pärast PHP2Shelli

Siin tasub ausalt piiritleda. PHP2Shell, see tähendab CVE-2026-109618 ja CVE-2026-109619, asub PHP interpretaatoris. Ükski vahend, mis loeb teie rakenduse koodi, neid turvauke ei leia ja ükski koodimuudatus neid ei sulge. Seda teeb ainult uuendus versioonile PHP 8.5.12, 8.4.27, 8.3.36 või 8.2.35.

Sellest hoolimata annab staatiline analüüs turvalisusele panuse, kolmes kohas:

  1. Uuendamisvõime: See leiab koodi, mis uutel PHP versioonidel enam ei tööta. Nii väheneb kõrgus, et minna versioonilt 8.1 või 8.2 toetatud versioonile.
  2. Omad augud: Taint-analüüs leiab teid SQL-injektsiooni, Cross-Site-Scriptingu või failide kaasamiseni. PHP projekt teeb oma turvapoliitikas selgeks, et kontrollimata sisendid funktsioonidele nagu mysqli_query() ei ole PHP viga, vaid kuuluvad rakenduse vastutusele.
  3. Töökindlus: Paljud fataalsed vead tekivad väljakutsetest nullile või valedest tüüpidest. php.net soovitab seoses CVE-2026-109619-ga selgesõnaliselt kõrvaldada rakenduses väljastpoolt esilekutsutavad fataalsed vead.

Staatiline analüüs ei asenda inimese tehtavat turvaalast koodiülevaatust, kuid teeb selle tõhusamaks, sest rutiinsed vead on eelnevalt välja sõelutud.

Kuidas PHP SOS konkreetselt aitab?

Turvaauditi ja penetratsioonitesti raames tegutseme nii:

  • Vahendite seadistamine: PHPStan või Psalm sobiva taseme ja baseline'iga, lõimitud teie olemasolevasse torujuhtmesse.
  • Turvaleidude hindamine: Kontrollime taint-analüüsi tulemusi ja eristame päris riskid valehäiretest.
  • Uuenduse ettevalmistamine: Näitame, millised kohad blokeerivad üleminekut toetatud PHP versioonile.
  • Tulemuste üleandmine: Saate prioriseeritud nimekirja konkreetsete koodikohtadega oma tiimile või agentuurile.

Korduma kippuvad küsimused

Mis vahe on PHPStan'il ja Psalm'il?

Mõlemad kontrollivad tüüpe ja leiavad vigu käivitamata. PHPStan loendab oma tasemeid 0-st (lõtv) kuni 10-ni (range), Psalm 8-st (lõtv) kuni 1-ni (range). Psalm toob kaasa sisseehitatud taint-analüüsi turvaprobleemide jaoks.

Kas ma saan PHPStani vanasse projekti kasutusele võtta?

Jah. Baseline'iga salvestab PHPStan kõik olemasolevad teated ühte faili ja teatab seejärel ainult uutest vigadest. Nii alustab tiim ilma vigade uputuseta ja vähendab vanu probleeme järk-järgult.

Kas staatiline analüüs leiab PHP2Shelli?

Ei. PHP2Shell asub PHP interpretaatoris, mitte teie koodis. Selle vastu aitab ainult PHP uuendus. Staatiline analüüs aitab siiski koodi uute PHP versioonide jaoks ette valmistada, et uuendus oleks kiiremini võimalik.

Millist taset valida?

Alustuseks madal tase ilma baseline'ita või kõrgem tase koos baseline'iga. Numbrist olulisem on, et analüüs jookseb igal muudatusel automaatselt ja ei lase uusi vigu läbi.

Allikad

Kohene kontakt

Iga tund loeb. Kirjutage meile kohe.

Kirjeldage lühidalt süsteemi, PHP versiooni ja tähelepanekut. Võtame teiega ühendust, selgitame olukorra välja ja töötame kaugtööna, kuni intsident on lõpetatud ja dokumenteeritud.

Kohene abi