Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

Statická analýza: PHPStan a Psalm

PHPStan a Psalm nachádzajú chyby v kóde PHP bez jeho spustenia. Psalm navyše sleduje nebezpečné toky údajov. Zraniteľnosti v samotnom interpreteri PHP nenájde ani jeden z nich.

Stav 4 min čítaniaZnalosti o PHP

Stručne: Statická analýza kontroluje kód PHP bez jeho spustenia a nachádza tak chyby typov, nedefinované premenné, mŕtvy kód a volania na možno prázdnych hodnotách. Dva rozšírené nástroje sú PHPStan (úrovne pravidiel 0 až 10) a Psalm (úrovne chýb 1 až 8, plus taint analýza pre nebezpečné toky údajov). Nachádzajú chyby vo vašej aplikácii, nie v interpreteri PHP; proti zraniteľnostiam ako PHP2Shell pomáha iba aktualizácia PHP.

Čo je statická analýza?

Test spustí kód a porovná výsledok. Statická analýza naopak číta kód ako veľmi dôkladný kontrolór a z typov, návratových hodnôt a volaní usudzuje, kde sa môže niečo pokaziť. Nachádza chyby aj vo vetvách, ku ktorým sa žiadny test nikdy nedostane.

Pre rozhodovateľov je prínos jednoduchý: chyby, ktoré sa nájdu pred spustením ostrej prevádzky, stoja zlomok chýb, ktorých si všimnú zákazníci. Pre vývojárov je to stály spoločník, ktorý beží vo vývojovom prostredí aj v pipeline CI. Ak analýza pri zmene zlyhá, zmena sa neprevezme, kým sa chyba neodstráni. Tak nenarastá nový starý dlh, kým sa existujúci postupne odbúrava. Spolu s testami pomocou PHPUnit a Pest tvorí základ kvality kódu.

PHPStan: úrovne pravidiel od 0 do 10

PHPStan sa inštaluje ako vývojová závislosť a na beh potrebuje PHP od 7.4:

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

Bez ďalšieho údaja PHPStan kontroluje len to najnutnejšie. Prísnosť riadite jedenástimi úrovňami, každá zahŕňa tie pod ňou:

Úroveň Čo sa navyše kontroluje (výber)
0 neznáme triedy a funkcie, nesprávny počet argumentov, vždy nedefinované premenné
3 návratové typy a typy priraďované vlastnostiam
5 typy argumentov pri volaniach funkcií a metód
6 chýbajúce údaje o typoch
8 volania metód a prístupy k vlastnostiam na hodnotách, ktoré môžu byť null
10 najprísnejšie zaobchádzanie s mixed, aj pri chýbajúcich typoch

S --level max beží vždy najvyššia úroveň. Dokumentácia však upozorňuje, že upgrade PHPStan môže potom priniesť veľa nových hlásení. Typický nález od úrovne 8:

<?php
function kundenname(?Kunde $kunde): string
{
    return $kunde->name();   // PHPStan: volanie na hodnote, ktorá môže byť null
}

Zavedenie PHPStan bez záplavy chýb: baseline

V narastených projektoch hlási PHPStan na vysokej úrovni často stovky miest. Baseline tento problém rieši: uloží všetky existujúce hlásenia do súboru a PHPStan odvtedy hlási iba nové chyby.

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

Vygenerovaný súbor phpstan-baseline.neon zapojíte do konfigurácie:

includes:
    - phpstan-baseline.neon

parameters:
    level: 6
    paths:
        - src
        - tests

Starý stav tak zostáva viditeľne zdokumentovaný, kým nový kód musí byť od začiatku čistý.

Psalm a taint analýza

Psalm sleduje podobné ciele ako PHPStan. Úrovne bežia opačne: 1 je najprísnejšia, 8 najzhovievavejšia, štandard je 2. Psalm potrebuje PHP od 8.2 a nastavuje sa takto:

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

Taint analýza je pre bezpečnosť obzvlášť zaujímavá. „Taint“ znamená znečistenie: Psalm označuje údaje zo zdrojov, ktoré môže útočník ovládať, napríklad $_GET, $_POST, $_COOKIE, $_REQUEST alebo php://input. Potom sleduje, či tieto údaje nedorazia nechránené na nebezpečné miesta, takzvané sinky: výstup pomocou echo, include, header alebo dotazy SQL. K vstavaným kategóriám patria okrem iného sql, html, shell, include, eval, ssrf a unserialize.

<?php
// Psalm hlási tok z $_GET do výstupu HTML (kategória html)
echo 'Hallo ' . $_GET['name'];

// Opravené: výstup maskovať podľa kontextu
echo 'Hallo ' . htmlspecialchars($_GET['name'] ?? '', ENT_QUOTES, 'UTF-8');

Dokumentácia Psalm otvorene uvádza hranice: analýza predpokladá, že maskovanie prebieha správne. Jemné chyby, napríklad chýbajúce úvodzovky okolo atribútu HTML, môžu napriek tomu nechať medzery. Psalm preto odporúča parametrizované dotazy pre SQL a šablóny citlivé na kontext pre HTML. Výsledky možno vypísať vo formáte SARIF, ktorému rozumie okrem iného GitHub Code Scanning.

Statická analýza a bezpečnosť po PHP2Shell

Tu sa oplatí čestné vymedzenie. PHP2Shell, teda CVE-2026-109618 a CVE-2026-109619, sídli v interpreteri PHP. Žiadny nástroj, ktorý číta váš aplikačný kód, tieto zraniteľnosti nenájde a žiadna zmena kódu ich neuzavrie. To zvládne iba aktualizácia na PHP 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35.

Napriek tomu statická analýza prispieva k bezpečnosti, na troch miestach:

  1. Schopnosť upgradu: Nachádza kód, ktorý na nových verziách PHP už nebeží. Tým klesá bariéra prejsť z 8.1 alebo 8.2 na podporovanú verziu.
  2. Vlastné zraniteľnosti: Taint analýza nachádza cesty pre SQL injection, cross-site scripting alebo vkladanie súborov. Projekt PHP vo svojich bezpečnostných zásadách objasňuje, že neoverené vstupy do funkcií ako mysqli_query() nie sú chybou PHP, ale sú v zodpovednosti aplikácie.
  3. Robustnosť: Mnohé fatálne chyby vznikajú volaniami na null alebo nesprávnymi typmi. php.net v súvislosti s CVE-2026-109619 výslovne radí opraviť v aplikácii fatálne chyby vyvolateľné zvonku.

Statická analýza nenahrádza bezpečnostný code review ľuďmi, robí ho však efektívnejším, pretože rutinné chyby sú vopred vytriedené.

Ako PHP SOS konkrétne pomáha?

V rámci bezpečnostného auditu a penetračného testu postupujeme takto:

  • Nastavenie nástrojov: PHPStan alebo Psalm s vhodnou úrovňou a baseline, zapojené do vašej existujúcej pipeline.
  • Hodnotenie bezpečnostných nálezov: Kontrolujeme výsledky taint analýzy a oddeľujeme skutočné riziká od falošných poplachov.
  • Príprava upgradu: Ukazujeme, ktoré miesta blokujú prechod na podporovanú verziu PHP.
  • Odovzdanie výsledkov: Dostanete prioritizovaný zoznam s konkrétnymi miestami v kóde pre váš tím alebo agentúru.

Časté otázky

Aký je rozdiel medzi PHPStan a Psalm?

Oba kontrolujú typy a nachádzajú chyby bez spustenia. PHPStan počíta svoje úrovne od 0 (voľná) po 10 (prísna), Psalm od 8 (voľná) po 1 (prísna). Psalm má vstavanú taint analýzu pre bezpečnostné problémy.

Dá sa PHPStan zaviesť do starého projektu?

Áno. S baseline PHPStan uloží všetky existujúce hlásenia do súboru a potom hlási iba nové chyby. Tím tak začne bez záplavy chýb a odbúrava staré bremená postupne.

Nájde statická analýza PHP2Shell?

Nie. PHP2Shell sídli v interpreteri PHP, nie vo vašom kóde. Proti tomu pomáha iba aktualizácia PHP. Statická analýza však pomáha pripraviť kód na nové verzie PHP, aby bola aktualizácia rýchlejšie možná.

Ktorú úroveň zvoliť?

Na začiatok nízku úroveň bez baseline alebo vyššiu úroveň s baseline. Dôležitejšie než číslo je, aby analýza bežala automaticky pri každej zmene a nepúšťala cez seba nové chyby.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc