PHP napędza znaczną część internetu. Choć gałąź PHP 8.x przyniosła ogromny skok wydajności, nowoczesne typowanie danych i szereg wbudowanych zabezpieczeń, żaden język programowania nie obroni się sam, jeśli środowisko serwerowe zostanie pozostawione w domyślnej konfiguracji „wszystko dozwolone”.
Jednym z najprostszych, a zarazem najskuteczniejszych kroków w kierunku twardego hardeningu (utwardzania) serwera jest wykorzystanie dyrektywy disable_functions w pliku konfiguracyjnym php.ini.
Przyjrzyjmy się bliżej, dlaczego warto z niej skorzystać i które funkcje należy bezwzględnie odciąć od świata.
Czym jest disable_functions i dlaczego jest kluczowe?
Wyobraź sobie sytuację idealną: kod Twojej strony, wtyczki oraz motywy są zawsze czyste i wolne od błędów. W rzeczywistości jednak aplikacje webowe bywają złożone, a luka w przestarzałej wtyczce lub podatność typu SQL Injection / File Upload może pozwolić intruzowi na wgranie złośliwego pliku (tzw. Webshella).
Gdy napastnik uzyska już taki punkt zaczepienia, jego kolejnym krokiem jest próba wykonania poleceń w systemie operacyjnym (np. pobrania złośliwego oprogramowania, przeszukania plików konfiguracyjnych czy próby eskalacji uprawnień). I tu z pomocą przychodzi disable_functions. Blokując te funkcje na poziomie interpretera PHP, odbierasz intruzowi narzędzia do wykonywania jakichkolwiek poleceń systemowych – nawet jeśli uda mu się przemycić kod na serwer.
Czarwona lista: Co dokładnie warto zablokować i dlaczego?
W pliku konfiguracyjnym php.ini możesz wskazać listę funkcji, które mają zostać całkowicie wyłączone. Oto najgroźniejsze z nich i powody, dla których powinny znaleźć się na liście blokowanych:
system
Co robi: Uruchamia zewnętrzne programy i natychmiast wypisuje ich wynik bezpośrednio w przeglądarce.
Dlaczego blokować: Klasyczna brama do natychmiastowego wykonania dowolnego kodu systemowego przez napastnika (RCE – Remote Code Execution).
shell_exec (orad operator ` – tzw. backticks)
Co robi: Wykonuje polecenia systemowe przez powłokę i zwraca cały wynik jako ciąg znaków.
Dlaczego blokować: Ulubiona funkcja autorów webshelli do sprawdzania stanu systemu, przeglądania katalogów czy wywoływania skryptów atakujących.
passthru
Co robi: Uruchamia polecenie systemowe i przesyła surowe dane zwrotne bezpośrednio do przeglądarki (często używane do strumieniowania danych binarnych).
Dlaczego blokować: Kolejny wektor umożliwiający bezwzględne przejęcie kontroli nad procesami systemowymi.
how_source / highlight_file
Co robi: Odczytuje plik i wyświetla jego zawartość z pokolorowaną składnią PHP.
Dlaczego blokować: Choć brzmi niepozornie, funkcja ta może posłużyć do podejrzenia poufnych plików źródłowych (np. plików konfiguracyjnych z hasłami do bazy danych czy kluczami API), jeśli napastnik zmusi skrypt do odczytania samego siebie.
Wskazówka: Standardowe, dobrze napisanego aplikacje webowe (jak systemy zarządzania treścią czy nowoczesne frameworki) nie potrzebują żadnej z powyższych funkcji do normalnego działania. Ich wyłączenie w żaden sposób nie wpłynie na funkcjonalność Twojej strony.
Co jeszcze warto zrobić w PHP 8.x, aby podnieść bezpieczeństwo?
Samo wyłączenie funkcji systemowych to świetny początek. Warto jednak dopracować konfigurację php.ini o kilka dodatkowych, fundamentalnych zasad:
Ukrycie wersji PHP (expose_php = Off)
Domyślnie PHP dodaje w nagłówkach HTTP informację o swojej dokładnej wersji. Po co ułatwiać życie skanerom podatności szukającym konkretnych dziur w starszych podwersjach? Wyłączenie tej opcji sprawia, że serwer milczy na temat tego, co „siedzi pod maską”.
Rozsądne zarządzanie błędami (display_errors = Off)
W środowisku produkcyjnym błędy PHP nigdy nie powinny pokazywać się na ekranie odwiedzającego. Taki komunikat może zdradzić strukturę katalogów na serwerze, używane ścieżki czy fragmenty zapytań SQL. Zamiast tego włącz logowanie błędów do bezpiecznego, niedostępnego z zewnątrz pliku (log_errors = On).
Ochrona ciasteczek sesyjnych (session.cookie_httponly = On oraz session.cookie_secure = On)
Zabezpiecza sesje użytkowników przed kradzieżą za pomocą skryptów stron trzecich (ataki XSS) oraz wymusza przesyłanie ciasteczek wyłącznie przez szyfrowane połączenie HTTPS.
Podsumowanie
Bezpieczeństwo strony opartej na PHP to nie dzieło przypadku, a suma małych, przemyślanych kroków konfiguracyjnych. Blokada funkcji takich jak system czy shell_exec jest kluczowa – robisz to raz, a zyskujesz potężną warstwę obrony przed skutkami ewentualnych podatności w oprogramowaniu. Dbaj o higienę swojego środowiska, a Twoja strona odwdzięczy się stabilnością i niezawodnością!
