Aktuális helyzet: PHP2Shell. Két kritikus PHP-rés (CVSS 9,2) lehetővé teszi kártékony kód futtatását bejelentkezés nélkül. Javítások 2026. 10. 21. óta.Mi a teendő most →

Statikus elemzés: PHPStan és Psalm

A PHPStan és a Psalm a PHP-kód hibáit a kód futtatása nélkül találja meg. A Psalm emellett a nem biztonságos adatfolyamokat is követi. A PHP-értelmezőben lévő réseket egyik sem találja meg.

Állapot 5 perc olvasási időPHP-tudástár

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:

  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, 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, 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.

Források

Azonnali kapcsolat

Minden óra számít. Írjon nekünk most.

Ismertesse röviden a rendszert, a PHP-verziót és a megfigyelését. Jelentkezünk, tisztázzuk a helyzetet, és távolról dolgozunk, amíg az incidens le nem zárul és dokumentálva nem lesz.

Azonnali segítség