# Analiza statică: PHPStan și Psalm

> PHPStan și Psalm explicate: niveluri de reguli, baseline, taint analysis și ce poate și ce nu poate face analiza statică pentru aplicații PHP sigure.

Sursa: https://phpsos.de/ro/php/statische-analyse/  
Stadiu: 25.10.2026  
Furnizor: PHP SOS, Asistență de urgență PHP și securitatea serverelor. Ajutor imediat pe WhatsApp: https://wa.me/491736494914?text=Bun%C4%83%20ziua%2C%20PHP%20SOS%2C%20avem%20nevoie%20de%20ajutor%20cu%20serverul%20nostru%20PHP.%20Firma%3A%20%E2%80%A6%20Site%3A%20%E2%80%A6

**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](https://phpsos.de/ro/php/php-testen/), 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:

```bash
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
<?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.

```bash
vendor/bin/phpstan analyse --level 6 src tests --generate-baseline
```

Fișierul generat `phpstan-baseline.neon` îl includeți în configurație:

```neon
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:

```bash
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
<?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:

1. **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ă.
2. **Vulnerabilități proprii:** taint analysis găsește căile spre [SQL injection](https://phpsos.de/ro/ratgeber/sql-injection-php/), 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.
3. **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](https://phpsos.de/ro/blog/sicherheits-code-review-php/) 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](https://phpsos.de/ro/leistungen/sicherheitsaudit-penetrationstest/) 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.

## Surse

- [PHPStan](https://phpstan.org/)
- [Psalm](https://psalm.dev/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
