Aktuální situace: PHP2Shell. Dvě kritické zranitelnosti PHP (CVSS 9.2) umožňují spustit škodlivý kód bez přihlášení. Záplaty od 21. 10. 2026.Co nyní udělat →

Bezpečnostní code review pro projekty v PHP

Jak týmy cíleně procházejí vlastní kód PHP kvůli bezpečnostním mezerám: druhy review, kritické funkce, užitečné nástroje a kontrolní seznam.

Stav 5 min čteníBezpečný vývoj

Stručně: Bezpečnostní code review pro PHP je cílené čtení zdrojového kódu s jednou otázkou: kde mohou cizí vstupy způsobit něco, co nesmějí? Osvědčily se dvě formy, review každé změny a základní review celého projektu, podložené statickou analýzou pomocí PHPStan nebo Psalm. Zranitelnosti v interpretu PHP jako PHP2Shell review nenajde, ale najde mnoho chyb, které vznikají ve vlastním kódu.

Proč se právě teď podívat do vlastního kódu?

PHP2Shell v posledním říjnovém týdnu 2026 zaměstnalo především administrátory. Záplatovat, restartovat, doložit: práce byla na serveru. Pro vývojářské týmy zůstává potom nepříjemná otázka. Pokud může útočník přes jinou zranitelnost spustit kód, co najde v naší aplikaci? A kolik z těchto zranitelností jsme napsali sami?

OWASP Top 10 ukazuje už léta, že většina slabin ve webových aplikacích není exotická. Chybějící řízení přístupu, injection a nezabezpečená konfigurace jsou vysoko. Jsou to chyby, které zkušený pohled najde ve zdrojovém kódu dlouho předtím, než je útočník vyzkouší.

K tomu přistupuje praktický důvod. Mnoho firem si právě teď své servery tak jako tak nechává kontrolovat, záplatovat a zpevňovat. Kdo se současně podívá na vlastní aplikaci, uzavře mezeru mezi provozem a vývojem. Zpevněný server se zranitelnou aplikací zůstává napadnutelný a čistě napsaná aplikace na nezáplatovaném PHP také.

Základní review, nebo review změn?

OWASP Cheat Sheet k Secure Code Review rozlišuje dva druhy, které se v praxi doplňují:

Druh Kdy Rozsah Cíl
Základní review (baseline) nový projekt, velké vydání, po incidentu celý projekt, vážený podle rizika zachytit stav slabin
Review změn (diff) každý pull request jen změněný kód zabránit novým chybám

Základní review po incidentu je obzvlášť cenné. Kdo právě vyčistil server, měl by vědět, zda aplikace nenabízí další vstupní brány. Review změn udržuje stav poté čistý, protože každá změna se před sloučením čte i z hlediska bezpečnosti.

Code review v PHP: kde se hromadí bezpečnostní chyby

V projektech PHP se vyplatí cílený pohled na určité funkce a vzory. Nejsou zakázané, ale každý nález si zaslouží otázku, zda se do něj mohou dostat cizí data.

Vzor v kódu Možné riziko Prohloubení
SQL sestavené spojováním řetězců s proměnnými SQL injection Prevence SQL injection v PHP
unserialize() na datech zvenčí injektáž objektů Nezabezpečená deserializace v PHP
include nebo require s proměnnou cestou vkládání cizích souborů Prevence Local a Remote File Inclusion
exec(), system(), shell_exec(), proc_open() spouštění příkazů command injection
Výstup bez htmlspecialchars() Cross-Site Scripting escapování podle kontextu
== u tokenů nebo hashů převod typů obchází kontroly hash_equals(), striktní porovnání
eval(), extract() na vstupech injektáž kódu nebo proměnných většinou bez náhrady vypustit

Rychlý první přehled umožní jednoduché vyhledávání. Review nenahradí, ale ukáže, kde začít:

# Nálezy rizikových funkcí ve vlastním kódu (vendor vyloučen)
grep -rnE "\b(unserialize|eval|extract|shell_exec|exec|system|passthru|proc_open)\s*\(" src/ app/ 2>/dev/null

Minimálně stejně důležité je to, co v kódu chybí. Kontroluje každý controller, zda smí přihlášený uživatel tento záznam vidět nebo měnit? Omezují se uploady na typ a místo uložení? Takové mezery nenajde žádné hledání názvů funkcí, jen čtení průběhu.

Nástroje, které review podpírají

Statická analýza kontroluje kód, aniž by ho spouštěla. PHPStan a Psalm najdou chyby typů, nedosažitelný kód a chybné předpoklady o návratových hodnotách. Psalm navíc nabízí taint analýzu, která sleduje, zda data z požadavků proudí nezkontrolovaně na kritická místa. Obě lze zpřísňovat postupně, takže se mohou zapojit i starší projekty. Přehled podává stránka Statická analýza: PHPStan a Psalm.

# Statická analýza v projektu, úroveň postupně zvyšovat
vendor/bin/phpstan analyse src --level=5
# Taint analýza pomocí Psalm
vendor/bin/psalm --taint-analysis

Nástroje dávají nápovědy, ne rozsudky. Každý nález potřebuje posouzení a prázdná zpráva neznamená, že je aplikace bezpečná.

Stejně důležité jako nalézání je zaznamenávání. Každé zjištění by mělo být zachyceno s místem nálezu, krátkým popisem, odhadem rizika, doporučenou nápravou a stavem, nejlépe přímo v systému ticketů týmu. Tak lze dohledat, co bylo opraveno, co vědomě přijato a co je ještě otevřené. Po nápravě se vyplatí druhý pohled: Je odstraněna příčina, nebo jen jeden příznak? Objevuje se stejný vzor na jiných místech kódu? Chyba, která se jednou stala, se podle zkušenosti zřídka skrývá jen na jednom místě.

Kontrolní seznam pro vlastní tým

Pro review změn se osvědčil krátký, pevný seznam. Patří do šablony pro pull requesty:

  1. Odkud pocházejí všechna data, která tato změna zpracovává, a kontrolují se na straně serveru?
  2. Sestavují se databázové dotazy výhradně se zástupnými symboly?
  3. Je každý výstup escapován pro svůj kontext, tedy HTML, atribut, JavaScript nebo URL?
  4. Kontroluje kód oprávnění pro právě tento objekt, nejen přihlášení?
  5. Dostávají se hesla, tokeny nebo osobní údaje do logů nebo chybových hlášení?
  6. Jsou tajemství v kódu nebo ve verzovaných souborech?
  7. Byly přidány nové závislosti a jsou udržované?
Tip

Bezpečnostně kritické části jako přihlášení, správa oprávnění, platební procesy a uploady nechte vždy číst druhou osobu, která se na kódu nepodílela. Cizí pohled najde předpoklady, které autor považuje za samozřejmé.

Jak konkrétně pomáhá PHP SOS?

  • Se specializovanými partnery provedeme základní review vaší aplikace v PHP, váženě podle částí s nejvyšším rizikem.
  • Nastavíme PHPStan nebo Psalm podle stavu vašeho projektu a napíšeme kontrolní seznam pro vaše pull requesty.
  • Review propojíme s pohledem na server a konfiguraci, protože mnoho zranitelností vzniká až ve spolupráci.
  • Kde je žádoucí kontrola zvenčí, review doplníme o bezpečnostní audit a penetrační test.

Závěr: Code review je nejlevnější místo, kde opravit bezpečnostní chyby, totiž dříve, než se dodají. Kdo kontroluje každou změnu krátkým seznamem a projekt občas projde celý, trvale zmenšuje plochu pro útok.

Časté dotazy

Jaký je rozdíl mezi code review a penetračním testem?

Code review čte zdrojový kód a nachází chyby dříve, než se dodají. Penetrační test napadá běžící aplikaci zvenčí. Obojí se doplňuje: review nachází příčiny, test ukazuje, co je skutečně zneužitelné.

Najde code review zranitelnosti jako PHP2Shell?

Ne. PHP2Shell je v interpretu PHP, ne v kódu aplikace. Pomáhá jen aktualizace PHP s restartem. Review najde chyby ve vlastním kódu, například injection, chybějící kontroly oprávnění nebo nebezpečnou deserializaci.

Stačí PHPStan nebo Psalm pro bezpečnostní review?

Jsou dobrým základem a automaticky najdou mnoho chyb. Logické chyby, chybějící kontroly oprávnění a chybné předpoklady o průběhu pozná ale jen člověk, který ví, co má aplikace dělat.

Jak dlouho trvá bezpečnostní code review?

Závisí na rozsahu. Review každé změny v pull requestu stojí málo času. Úplné review rozrostlého projektu je samostatný záměr, který se podle rizika omezuje na nejdůležitější části.

Zdroje

Okamžitý kontakt

Každá hodina se počítá. Napište nám hned.

Stručně popište systém, verzi PHP a pozorování. Ozveme se, vyjasníme situaci a budeme pracovat na dálku, dokud nebude incident uzavřen a zdokumentován.

Okamžitá pomoc