Pe scurt: Analiza statică verifică codul PHP fără să-l execute și găsește astfel erori de tip, variabile nedefinite, cod mort și apeluri pe valori posibil goale. Cele două instrumente răspândite sunt PHPStan (niveluri de reguli de la 0 la 10) și Psalm (niveluri de eroare de la 1 la 8, plus o taint analysis pentru fluxuri nesigure de date). Ele găsesc erori în aplicația dumneavoastră, nu în interpretorul PHP; împotriva vulnerabilităților precum PHP2Shell ajută doar actualizarea PHP.
Ce este analiza statică?
Un test execută codul și compară rezultatul. Analiza statică, în schimb, citește codul ca un verificator foarte atent și deduce din tipuri, valori returnate și apeluri unde ceva poate merge prost. Ea găsește erori și în ramuri pe care niciun test nu le atinge vreodată.
Pentru factorii de decizie, beneficiul este simplu: erorile găsite înainte de lansare costă o fracțiune din cele pe care le observă clienții. Pentru dezvoltatori, este un însoțitor permanent, care rulează în mediul de dezvoltare și în pipeline-ul CI. Dacă analiza dă alarma la o modificare, aceasta nu este preluată până când eroarea este remediată. Astfel nu se mai adaugă moștenire nouă, în timp ce cea existentă este redusă treptat. Împreună cu testele cu PHPUnit și Pest, ea formează fundamentul calității codului.
PHPStan: niveluri de reguli de la 0 la 10
PHPStan se instalează ca dependență de dezvoltare și are nevoie pentru a rula de PHP de la 7.4:
composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src tests
Fără alte indicații, PHPStan verifică doar strictul necesar. Rigoarea o controlați prin unsprezece niveluri, fiecare incluzându-le pe cele de dedesubt:
| Nivel | Ce se verifică în plus (selecție) |
|---|---|
| 0 | clase și funcții necunoscute, număr greșit de argumente, variabile mereu nedefinite |
| 3 | tipuri returnate și tipurile atribuite proprietăților |
| 5 | tipurile argumentelor la apelurile de funcții și metode |
| 6 | indicații de tip lipsă |
| 8 | apeluri de metode și accesări de proprietăți pe valori care pot fi null |
| 10 | tratarea cea mai strictă a mixed, inclusiv la tipuri lipsă |
Cu --level max rulează întotdeauna nivelul cel mai înalt. Documentația avertizează însă că un upgrade al PHPStan poate aduce atunci multe mesaje noi. O constatare tipică de la nivelul 8:
<?php
function kundenname(?Kunde $kunde): string
{
return $kunde->name(); // PHPStan: apel pe o valoare care poate fi null
}
Introducerea PHPStan fără un val de erori: baseline-ul
În proiectele crescute în timp, PHPStan raportează la un nivel înalt adesea sute de locuri. Baseline-ul rezolvă problema: salvează toate mesajele existente într-un fișier, iar PHPStan raportează de atunci doar erorile noi.
vendor/bin/phpstan analyse --level 6 src tests --generate-baseline
Fișierul generat phpstan-baseline.neon îl includeți în configurație:
includes:
- phpstan-baseline.neon
parameters:
level: 6
paths:
- src
- tests
Astfel, moștenirea rămâne documentată vizibil, în timp ce codul nou trebuie să fie curat de la început.
Psalm și taint analysis
Psalm urmărește obiective similare cu PHPStan. Nivelurile merg invers: 1 este cel mai strict, 8 cel mai îngăduitor, valoarea implicită fiind 2. Psalm are nevoie de PHP de la 8.2 și se configurează astfel:
composer require --dev vimeo/psalm
./vendor/bin/psalm --init
./vendor/bin/psalm --taint-analysis
Taint analysis este deosebit de interesantă pentru securitate. „Taint” înseamnă contaminare: Psalm marchează datele din surse pe care un atacator le poate controla, de exemplu $_GET, $_POST, $_COOKIE, $_REQUEST sau php://input. Apoi urmărește dacă aceste date ajung neprotejate în locuri periculoase, așa-numitele sinks: ieșirea cu echo, include, header sau interogări SQL. Categoriile integrate includ, printre altele, sql, html, shell, include, eval, ssrf și unserialize.
<?php
// Psalm raportează un flux de la $_GET în ieșirea HTML (categoria html)
echo 'Hallo ' . $_GET['name'];
// Remediat: mascarea ieșirii potrivit contextului
echo 'Hallo ' . htmlspecialchars($_GET['name'] ?? '', ENT_QUOTES, 'UTF-8');
Documentația Psalm își numește deschis limitele: analiza presupune că mascarea se face corect. Greșeli subtile, de exemplu ghilimele lipsă în jurul unui atribut HTML, pot lăsa totuși vulnerabilități. Psalm recomandă de aceea interogări parametrizate pentru SQL și șabloane conștiente de context pentru HTML. Rezultatele pot fi emise în formatul SARIF, pe care îl înțelege, printre altele, GitHub Code Scanning.
Analiza statică și securitatea după PHP2Shell
Aici merită o delimitare sinceră. PHP2Shell, adică CVE-2026-109618 și CVE-2026-109619, se află în interpretorul PHP. Niciun instrument care citește codul aplicației dumneavoastră nu găsește aceste vulnerabilități, iar nicio modificare de cod nu le închide. Aceasta o realizează doar actualizarea la PHP 8.5.12, 8.4.27, 8.3.36 sau 8.2.35.
Totuși, analiza statică contribuie la securitate în trei locuri:
- Capacitatea de upgrade: găsește codul care nu mai rulează pe versiuni PHP noi. Astfel scade bariera de a trece de la 8.1 sau 8.2 la o versiune acceptată.
- Vulnerabilități proprii: taint analysis găsește căile spre SQL injection, cross-site scripting sau includerea de fișiere. Proiectul PHP precizează în politica sa de securitate că datele de intrare neverificate transmise unor funcții precum
mysqli_query()nu sunt o eroare a PHP, ci țin de responsabilitatea aplicației. - Robustețe: multe erori fatale apar din apeluri pe null sau din tipuri greșite. În legătură cu CVE-2026-109619, php.net recomandă explicit remedierea în aplicație a erorilor fatale care pot fi declanșate din exterior.
Analiza statică nu înlocuiește un code review de securitate făcut de oameni, dar îl face mai eficient, deoarece erorile de rutină sunt deja eliminate.
Cum ajută PHP SOS concret?
În cadrul auditului de securitate și al testului de penetrare procedăm astfel:
- Configurarea instrumentelor: PHPStan sau Psalm cu nivel potrivit și baseline, integrate în pipeline-ul dumneavoastră existent.
- Evaluarea constatărilor de securitate: Verificăm rezultatele taint analysis și separăm riscurile reale de alarmele false.
- Pregătirea upgrade-ului: Arătăm ce locuri blochează trecerea la o versiune PHP acceptată.
- Predarea rezultatelor: Primiți o listă prioritizată, cu locuri concrete din cod, pentru echipa sau agenția dumneavoastră.
Întrebări frecvente
Care este diferența dintre PHPStan și Psalm?
Ambele verifică tipurile și găsesc erori fără execuție. PHPStan numără nivelurile de la 0 (relaxat) la 10 (strict), Psalm de la 8 (relaxat) la 1 (strict). Psalm vine cu o taint analysis integrată pentru probleme de securitate.
Pot introduce PHPStan într-un proiect vechi?
Da. Cu un baseline, PHPStan salvează toate mesajele existente într-un fișier și raportează de atunci doar erorile noi. Astfel echipa începe fără un val de erori și reduce treptat moștenirea.
Găsește analiza statică PHP2Shell?
Nu. PHP2Shell se află în interpretorul PHP, nu în codul dumneavoastră. Împotriva lui ajută doar actualizarea PHP. Analiza statică ajută însă la pregătirea codului pentru versiuni PHP noi, astfel încât actualizarea să fie posibilă mai repede.
Ce nivel ar trebui ales?
Pentru început, un nivel scăzut fără baseline sau un nivel mai ridicat cu baseline. Mai important decât cifra este ca analiza să ruleze automat la fiecare modificare și să nu lase să treacă erorile noi.