# Statická analýza: PHPStan a Psalm

> PHPStan a Psalm vysvetlené: úrovne pravidiel, baseline, taint analýza a čo statická analýza dokáže pre bezpečné aplikácie PHP a čo nie.

Zdroj: https://phpsos.de/sk/php/statische-analyse/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**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](https://phpsos.de/sk/php/php-testen/) 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:

```bash
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
<?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.

```bash
vendor/bin/phpstan analyse --level 6 src tests --generate-baseline
```

Vygenerovaný súbor `phpstan-baseline.neon` zapojíte do konfigurácie:

```neon
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:

```bash
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
<?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](https://phpsos.de/sk/ratgeber/sql-injection-php/), 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](https://phpsos.de/sk/blog/sicherheits-code-review-php/) ľ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](https://phpsos.de/sk/leistungen/sicherheitsaudit-penetrationstest/) 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

- [PHPStan](https://phpstan.org/)
- [Psalm](https://psalm.dev/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
