Aktuálna situácia: PHP2Shell. Dve kritické zraniteľnosti PHP (CVSS 9.2) umožňujú spustenie škodlivého kódu bez prihlásenia. Záplaty od 21. 10. 2026.Čo treba urobiť teraz →

Bezpečnostný code review pre projekty PHP

Ako tímy cielene prechádzajú vlastný kód PHP na bezpečnostné zraniteľnosti: druhy reviewov, kritické funkcie, zmysluplné nástroje a kontrolný zoznam.

Stav 5 min čítaniaBezpečný vývoj

Stručne: Bezpečnostný code review pre PHP je cielené čítanie zdrojového textu s jednou otázkou: kde môžu cudzie vstupy urobiť niečo, čo nesmú? Osvedčené sú dve formy, review každej zmeny a základný review celého projektu, podporené statickou analýzou pomocou PHPStan alebo Psalm. Zraniteľnosti v interpreteri PHP ako PHP2Shell review nenájde, nájde však mnohé chyby, ktoré vznikajú vo vlastnom kóde.

Prečo sa pozrieť do vlastného kódu práve teraz?

PHP2Shell zamestnával v poslednom októbrovom týždni 2026 predovšetkým administrátorov. Záplatovať, reštartovať, preukázať: práca ležala na serveri. Pre vývojárske tímy zostáva potom nepríjemná otázka. Ak môže útočník cez inú zraniteľnosť spustiť kód, čo nájde v našej aplikácii? A koľko z týchto zraniteľností sme napísali sami?

OWASP Top 10 ukazuje už roky, že väčšina slabín vo webových aplikáciách nie je exotická. Chýbajúca kontrola prístupu, injection a nebezpečná konfigurácia stoja vysoko. Sú to chyby, ktoré nájde cvičený pohľad v zdrojovom texte dávno predtým, než ich útočník vyskúša.

K tomu pristupuje praktický dôvod. Mnohé firmy si práve teraz tak či tak nechávajú servery kontrolovať, záplatovať a spevňovať. Kto sa na vlastnú aplikáciu pozrie jedným ťahom, uzavrie medzeru medzi prevádzkou a vývojom. Spevnený server so zraniteľnou aplikáciou zostáva napadnuteľný a čisto napísaná aplikácia na nezáplatovanom PHP rovnako.

Základný review alebo review zmien?

OWASP Cheat Sheet o Secure Code Review rozlišuje dva druhy, ktoré sa v praxi dopĺňajú:

Druh Kedy Rozsah Cieľ
Základný review (baseline) nový projekt, veľké vydanie, po incidente celý projekt, vážený podľa rizika zachytiť stav zraniteľností
Review zmien (diff) každý pull request len zmenený kód zabrániť novým chybám

Základný review po incidente je obzvlášť cenný. Kto práve vyčistil server, mal by vedieť, či aplikácia neponúka ďalšie vstupné brány. Review zmien potom udržiava stav čistý, pretože každá zmena sa pred zlúčením číta aj z bezpečnostného hľadiska.

Code review v PHP: kde sa hromadia bezpečnostné chyby

V projektoch PHP sa oplatí cielený pohľad na určité funkcie a vzory. Nie sú zakázané, ale každé nájdené miesto si zaslúži otázku, či sa tam môžu dostať cudzie údaje.

Vzor v kóde Možné riziko Prehĺbenie
SQL zložené spájaním reťazcov s premennými SQL injection Ako zabrániť SQL injection v PHP
unserialize() na údajoch zvonka injekcia objektov Nebezpečná deserializácia v PHP
include alebo require s premenlivou cestou vkladanie cudzích súborov Ako zabrániť Local a Remote File Inclusion
exec(), system(), shell_exec(), proc_open() vykonávanie príkazov Command Injection
výstup bez htmlspecialchars() Cross-Site Scripting escapovanie primerané kontextu
== pri tokenoch alebo hashoch prevod typov obchádza kontroly hash_equals(), striktné porovnania
eval(), extract() na vstupoch injekcia kódu alebo premenných väčšinou bez náhrady vyhodiť

Rýchly prvý prehľad sa dá získať jednoduchým hľadaním. Review nenahrádza, ukazuje však, kde začať:

# Nálezy riskantných funkcií vo vlastnom kóde (vendor vylúčený)
grep -rnE "\b(unserialize|eval|extract|shell_exec|exec|system|passthru|proc_open)\s*\(" src/ app/ 2>/dev/null

Prinajmenšom rovnako dôležité je to, čo v kóde chýba. Kontroluje každý controller, či smie prihlásený používateľ vidieť alebo meniť práve tento záznam? Obmedzujú sa uploady na typ a miesto uloženia? Takéto medzery nenájde žiadne hľadanie názvov funkcií, len čítanie postupu.

Nástroje, ktoré review podporujú

Statická analýza kontroluje kód bez jeho spustenia. PHPStan a Psalm nachádzajú chyby typov, nedosiahnuteľný kód a nesprávne predpoklady o návratových hodnotách. Psalm ponúka navyše analýzu taint, ktorá sleduje, či údaje z požiadaviek prúdia nekontrolovane na kritické miesta. Obe sa dajú postupne sprísňovať, takže vstúpiť môžu aj staršie projekty. Prehľad dáva Statická analýza: PHPStan a Psalm.

# Statická analýza v projekte, úroveň postupne zvyšovať
vendor/bin/phpstan analyse src --level=5
# Analýza taint pomocou Psalm
vendor/bin/psalm --taint-analysis

Nástroje dodávajú upozornenia, nie rozsudky. Každý nález potrebuje vyhodnotenie a prázdna správa neznamená, že je aplikácia bezpečná.

Rovnako dôležité ako nájdenie je zaznamenanie. Každé zistenie by sa malo zachytiť s miestom nálezu, krátkym opisom, odhadom rizika, odporúčanou nápravou a stavom, najlepšie priamo v systéme tiketov tímu. Tak sa dá dohľadať, čo sa opravilo, čo sa vedome akceptovalo a čo je ešte otvorené. Po oprave sa oplatí druhý pohľad: je odstránená príčina alebo len jeden príznak? Objavuje sa ten istý vzor na iných miestach v kóde? Chyba, ktorá sa raz urobila, podľa skúseností zriedka sedí len na jednom mieste.

Kontrolný zoznam pre vlastný tím

Pre review zmien sa osvedčil krátky, pevný zoznam. Patrí do šablóny pre pull requesty:

  1. Odkiaľ pochádzajú všetky údaje, ktoré táto zmena spracúva, a kontrolujú sa na strane servera?
  2. Skladajú sa databázové dotazy výlučne so zástupnými znakmi?
  3. Je každý výstup escapovaný pre svoj kontext, teda HTML, atribút, JavaScript alebo URL?
  4. Kontroluje kód oprávnenie práve pre tento objekt, nielen prihlásenie?
  5. Dostávajú sa heslá, tokeny alebo osobné údaje do protokolov alebo chybových hlásení?
  6. Sú tajomstvá v kóde alebo vo verzovaných súboroch?
  7. Pribudli nové závislosti a sú udržiavané?
Tip

Bezpečnostne kritické časti ako prihlásenie, správa práv, platobné postupy a uploady nechajte vždy prečítať druhou osobou, ktorá sa na kóde nepodieľala. Cudzí pohľad nájde predpoklady, ktoré autor považuje za samozrejmé.

Ako konkrétne pomáha PHP SOS?

  • S odbornými partnermi vykonáme základný review vašej aplikácie PHP, vážený podľa častí s najvyšším rizikom.
  • PHPStan alebo Psalm nastavíme podľa stavu vášho projektu a napíšeme kontrolný zoznam pre vaše pull requesty.
  • Review spojíme s pohľadom na server a konfiguráciu, pretože mnohé zraniteľnosti vznikajú až v súhre.
  • Tam, kde je žiaduca kontrola zvonka, review doplníme o bezpečnostný audit a penetračný test.

Záver: Code review je najlacnejšie miesto na odstránenie bezpečnostných chýb, a to skôr, než sa nasadia. Kto kontroluje každú zmenu krátkym zoznamom a projekt občas prejde celý, trvalo zmenšuje útočnú plochu.

Časté otázky

Aký je rozdiel medzi code review a penetračným testom?

Code review číta zdrojový text a nachádza chyby skôr, než sa nasadia. Penetračný test napáda bežiacu aplikáciu zvonka. Oba sa dopĺňajú: review nachádza príčiny, test ukazuje, čo je skutočne zneužiteľné.

Nájde code review zraniteľnosti ako PHP2Shell?

Nie. PHP2Shell sedí v interpreteri PHP, nie v kóde aplikácie. Proti tomu pomáha len aktualizácia PHP s reštartom. Review nachádza chyby vo vlastnom kóde, napríklad injection, chýbajúce kontroly oprávnení alebo nebezpečnú deserializáciu.

Stačia PHPStan alebo Psalm na bezpečnostný review?

Sú dobrým základom a automaticky nájdu veľa chýb. Logické chyby, chýbajúce kontroly oprávnení a nesprávne predpoklady o postupoch však rozpozná len človek, ktorý vie, čo má aplikácia robiť.

Ako dlho trvá bezpečnostný code review?

Závisí od rozsahu. Review každej zmeny v pull requeste stojí málo času. Úplný review prerasteného projektu je samostatný zámer, ktorý sa podľa rizika obmedzuje na najdôležitejšie časti.

Zdroje

Okamžitý kontakt

Každá hodina sa počíta. Napíšte nám hneď.

Stručne opíšte systém, verziu PHP a svoje pozorovanie. Ozveme sa, vyjasníme situáciu a budeme pracovať na diaľku, kým nebude incident uzavretý a zdokumentovaný.

Okamžitá pomoc