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 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:
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
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.
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:
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:
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
// 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:
- 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.
- Saját rések: A taint-elemzés utakat talál SQL-injekcióhoz, 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. - 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, 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 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.