# Statikus elemzés: PHPStan és Psalm

> PHPStan és Psalm érthetően: szintek, baseline, taint-elemzés, és hogy mit tud, mit nem tud nyújtani a statikus elemzés biztonságos PHP-alkalmazásokhoz.

Forrás: https://phpsos.de/hu/php/statische-analyse/  
Állapot: 2026. 10. 25.  
Szolgáltató: PHP SOS, PHP-vészhelyzeti segítség és szerverbiztonság. Azonnali segítség WhatsAppon: https://wa.me/491736494914?text=%C3%9Cdv%C3%B6zl%C3%B6m%2C%20PHP%20SOS%21%20Seg%C3%ADts%C3%A9gre%20van%20sz%C3%BCks%C3%A9g%C3%BCnk%20a%20PHP-szerver%C3%BCnkkel.%20C%C3%A9g%3A%20%E2%80%A6%20Weboldal%3A%20%E2%80%A6

**Röviden:** A statikus elemzés a PHP-kódot a futtatása nélkül ellenőrzi, és így típushibákat, nem definiált változókat, halott kódot és esetleg üres értékeken végzett hívásokat talál. A két elterjedt eszköz a PHPStan (0-tól 10-ig terjedő szabályszintek) és a Psalm (1-től 8-ig terjedő hibaszintek, emellett taint-elemzés a nem biztonságos adatfolyamokhoz). Az Ön alkalmazásában találnak hibákat, nem a PHP-értelmezőben; az olyan rések ellen, mint a PHP2Shell, csak a PHP-frissítés segít.

## Mi a statikus elemzés?

Egy teszt kódot futtat, és összeveti az eredményt. A statikus elemzés ezzel szemben úgy olvassa a kódot, mint egy nagyon alapos ellenőr, és a típusokból, visszatérési értékekből és hívásokból következtet arra, hol sülhet el valami rosszul. Olyan ágakban is talál hibákat, amelyeket egyetlen teszt sem ér el.

A döntéshozók számára a haszon egyszerű: az élesítés előtt megtalált hibák a töredékébe kerülnek azoknak, amelyeket az ügyfelek vesznek észre. A fejlesztők számára állandó társ, amely a fejlesztőkörnyezetben és a CI-folyamatban is együtt fut. Ha az elemzés egy módosításnál riaszt, a módosítás nem kerül átvételre, amíg a hibát ki nem javítják. Így nem nő új régi teher, miközben a meglévőt fokozatosan lebontják. A [PHPUnittal és Pesttel végzett tesztekkel](https://phpsos.de/hu/php/php-testen/) együtt ez a kódminőség alapja.

## PHPStan: szabályszintek 0-tól 10-ig

A PHPStant fejlesztési függőségként telepítik, és a futtatásához a PHP 7.4-es vagy újabb verziója kell:

```bash
composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src tests
```

További megadás nélkül a PHPStan csak a legszükségesebbet ellenőrzi. A szigort tizenegy szinttel szabályozhatja, mindegyik magában foglalja az alatta lévőket:

| Szint | Mit ellenőriz még (válogatás) |
|---|---|
| 0 | ismeretlen osztályok és függvények, hibás számú argumentum, mindig nem definiált változók |
| 3 | visszatérési típusok és a tulajdonságokhoz rendelt típusok |
| 5 | az argumentumok típusai függvény- és metódushívásoknál |
| 6 | hiányzó típusmegadások |
| 8 | metódushívások és tulajdonság-hozzáférések olyan értékeken, amelyek null lehetnek |
| 10 | a `mixed` legszigorúbb kezelése, hiányzó típusoknál is |

A `--level max` mindig a legmagasabb szinten fut. A dokumentáció azonban figyelmeztet, hogy a PHPStan frissítése ilyenkor sok új üzenetet hozhat. Egy tipikus lelet a 8. szinttől:

```php
<?php
function kundenname(?Kunde $kunde): string
{
    return $kunde->name();   // PHPStan: hívás egy olyan értéken, amely null lehet
}
```

## A PHPStan bevezetése hibaáradat nélkül: a baseline

A kinőtt projektekben a PHPStan magas szinten gyakran több száz helyet jelez. A baseline megoldja a problémát: az összes meglévő üzenetet egy fájlban tárolja, és a PHPStan attól kezdve csak az új hibákat jelzi.

```bash
vendor/bin/phpstan analyse --level 6 src tests --generate-baseline
```

A létrehozott `phpstan-baseline.neon` fájlt építse be a konfigurációba:

```neon
includes:
    - phpstan-baseline.neon

parameters:
    level: 6
    paths:
        - src
        - tests
```

Így a régi állomány láthatóan dokumentált marad, míg az új kódnak az elejétől fogva tisztának kell lennie.

## A Psalm és a taint-elemzés

A Psalm a PHPStanhoz hasonló célokat követ. A szintek fordítva futnak: az 1 a legszigorúbb, a 8 a legelnézőbb, az alapértelmezés a 2. A Psalmhoz a PHP 8.2-es vagy újabb verziója kell, és így állítják be:

```bash
composer require --dev vimeo/psalm
./vendor/bin/psalm --init
./vendor/bin/psalm --taint-analysis
```

A taint-elemzés a biztonság szempontjából különösen érdekes. A „taint” szennyeződést jelent: a Psalm megjelöli azokat az adatokat, amelyek olyan forrásból származnak, amelyet egy támadó irányíthat, például `$_GET`, `$_POST`, `$_COOKIE`, `$_REQUEST` vagy `php://input`. Aztán követi, hogy ezek az adatok védelem nélkül érkeznek-e veszélyes helyekre, az úgynevezett nyelőkbe (sink): `echo`-val történő kimenet, `include`, `header` vagy SQL-lekérdezések. A beépített kategóriák közé tartozik többek között az `sql`, `html`, `shell`, `include`, `eval`, `ssrf` és `unserialize`.

```php
<?php
// A Psalm jelzi a $_GET áramlását a HTML-kimenetbe (html kategória)
echo 'Hallo ' . $_GET['name'];

// Javítva: a kimenet maszkolása a környezetnek megfelelően
echo 'Hallo ' . htmlspecialchars($_GET['name'] ?? '', ENT_QUOTES, 'UTF-8');
```

A Psalm dokumentációja nyíltan megnevezi a korlátokat: az elemzés feltételezi, hogy a maszkolás helyesen történik. Finom hibák, például egy HTML-attribútum körüli hiányzó idézőjel, mégis hagyhatnak réseket. A Psalm ezért paraméterezett lekérdezéseket ajánl az SQL-hez, és környezetérzékeny sablonokat a HTML-hez. Az eredmények SARIF formátumban is kiadhatók, amelyet többek között a GitHub Code Scanning ért.

## Statikus elemzés és biztonság a PHP2Shell után

Itt őszinte elhatárolás szükséges. A PHP2Shell, vagyis a CVE-2026-109618 és a CVE-2026-109619, a PHP-értelmezőben van. Egyetlen eszköz, amely az Ön alkalmazáskódját olvassa, nem találja meg ezeket a réseket, és semmilyen kódmódosítás nem zárja be őket. Ezt csak a frissítés teszi meg a PHP 8.5.12, 8.4.27, 8.3.36 vagy 8.2.35 verzióra.

A statikus elemzés ennek ellenére három ponton hozzájárul a biztonsághoz:

1. **Frissíthetőség:** Megtalálja azt a kódot, amely az új PHP-verziókon már nem fut. Ezzel csökken a küszöb a 8.1-ről vagy 8.2-ről támogatott verzióra váltáshoz.
2. **Saját rések:** A taint-elemzés utakat talál [SQL-injekcióhoz](https://phpsos.de/hu/ratgeber/sql-injection-php/), cross-site scriptinghez vagy fájlbeágyazáshoz. A PHP-projekt biztonsági irányelvében tisztázza, hogy az ellenőrizetlen bemenetek átadása az olyan függvényeknek, mint a `mysqli_query()`, nem a PHP hibája, hanem az alkalmazás felelőssége.
3. **Robusztusság:** Sok végzetes hiba null-on végzett hívásokból vagy hibás típusokból keletkezik. A php.net a CVE-2026-109619-cel összefüggésben kifejezetten azt tanácsolja, hogy az alkalmazásban javítsák ki a kívülről kiváltható végzetes hibákat.

A statikus elemzés nem helyettesíti az emberek által végzett [biztonsági kódáttekintést](https://phpsos.de/hu/blog/sicherheits-code-review-php/), de hatékonyabbá teszi, mert a rutinhibákat előtte kiszűri.

## Hogyan segít konkrétan a PHP SOS?

A [biztonsági audit és penetrációs teszt](https://phpsos.de/hu/leistungen/sicherheitsaudit-penetrationstest/) keretében így járunk el:

- **Az eszközök beállítása:** PHPStan vagy Psalm megfelelő szinttel és baseline-nal, beépítve a meglévő folyamatába.
- **A biztonsági leletek értékelése:** Megvizsgáljuk a taint-elemzés eredményeit, és elkülönítjük a valódi kockázatokat a téves riasztásoktól.
- **A frissítés előkészítése:** Megmutatjuk, mely helyek akadályozzák a támogatott PHP-verzióra való váltást.
- **Az eredmények átadása:** Prioritás szerint rendezett listát kap konkrét kódhelyekkel a csapata vagy az ügynöksége számára.


## Gyakori kérdések

**Mi a különbség a PHPStan és a Psalm között?**  
Mindkettő típusokat ellenőriz, és futtatás nélkül talál hibákat. A PHPStan a szintjeit 0-tól (laza) 10-ig (szigorú), a Psalm 8-tól (laza) 1-ig (szigorú) számolja. A Psalm beépített taint-elemzést hoz a biztonsági problémákhoz.

**Bevezethetem a PHPStant egy régi projektbe?**  
Igen. A baseline segítségével a PHPStan az összes meglévő üzenetet egy fájlban tárolja, és utána csak az új hibákat jelzi. Így a csapat hibaáradat nélkül indul, és fokozatosan lebontja a régi terheket.

**Megtalálja a statikus elemzés a PHP2Shellt?**  
Nem. A PHP2Shell a PHP-értelmezőben van, nem az Ön kódjában. Ellene csak a PHP-frissítés segít. A statikus elemzés viszont segít előkészíteni a kódot az új PHP-verziókra, hogy a frissítés gyorsabban lehetséges legyen.

**Melyik szintet érdemes választani?**  
A kezdéshez alacsony szintet baseline nélkül, vagy magasabb szintet baseline-nal. A számnál fontosabb, hogy az elemzés minden módosításnál automatikusan lefusson, és ne engedje át az új hibákat.

## Források

- [PHPStan](https://phpstan.org/)
- [Psalm](https://psalm.dev/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
