Strona główna  /  Bezpieczeństwo  /  Jak wyłączyć wykonywanie PHP w katalogach WordPress?

Cyfrowa tarcza na tle serwerowni symbolizująca zabezpieczenie witryny WordPress przed nieautoryzowanym wykonaniem skryptów.

Jak wyłączyć wykonywanie PHP w katalogach WordPress?

Najprościej wyłączysz wykonywanie PHP w katalogu /wp-content/uploads/, dodając regułę na poziomie serwera. W Apache służy do tego plik .htaccess, a w Nginx konfiguracja bloku serwera. Dzięki temu nawet jeśli ktoś wgra tam plik PHP, serwer nie uruchomi go i zwróci błąd 403 Forbidden.

Dlaczego blokować PHP w katalogu uploads?

Katalog /wp-content/uploads/ powinien przechowywać głównie obrazy, dokumenty i inne pliki multimedialne. Nie powinien być miejscem wykonywania skryptów PHP. Ograniczenie tej możliwości jest elementem hardeningu WordPressa, czyli utwardzania konfiguracji przed wykorzystaniem luk.

Jednym z typowych scenariuszy ataku jest wgranie do katalogu mediów pliku będącego web shellem. To złośliwy skrypt, który daje napastnikowi możliwość wykonywania poleceń lub dalszej modyfikacji strony. Blokada działa przed uruchomieniem WordPressa, więc jest niezależna od wtyczek i może zatrzymać wykonanie takiego pliku.

Typ serwera Miejsce konfiguracji Wymagany restart
Apache .htaccess w katalogu uploads Nie
Nginx Blok server w konfiguracji Nginx Tak, po sprawdzeniu konfiguracji

Jak zablokować wykonywanie PHP w Apache?

Regułę dodaj w pliku .htaccess umieszczonym bezpośrednio w katalogu wp-content/uploads/. Nie wklejaj jej wyłącznie do głównego pliku .htaccess WordPressa, jeśli chcesz ograniczyć działanie tylko do katalogu z mediami.

  1. Wykonaj kopię zapasową plików, a następnie otwórz katalog /wp-content/uploads/ przez FTP, SFTP albo menedżer plików hostingu.
  2. Utwórz tam plik o nazwie .htaccess albo edytuj istniejący plik.
  3. Wklej do niego poniższy fragment:
<FilesMatch "\.php$">
    Require all denied
</FilesMatch>

Dyrektywa Require all denied jest właściwa dla Apache 2.4, czyli wersji używanej obecnie na większości hostingów. Na starszych konfiguracjach Apache może być potrzebna składnia:

<FilesMatch "\.php$">
    Order Allow,Deny
    Deny from all
</FilesMatch>

Nie stosuj obu wariantów jednocześnie bez sprawdzenia wersji serwera. Po zapisaniu pliku otwórz testowy adres wskazujący na plik PHP znajdujący się w tym katalogu. Oczekiwanym rezultatem jest odpowiedź 403 Forbidden.

Uwaga: niektóre wtyczki bezpieczeństwa lub narzędzia hostingowe mogą modyfikować albo nadpisywać plik .htaccess. Po wdrożeniu sprawdź, czy reguła nadal istnieje, zwłaszcza po zmianach konfiguracji wykonywanych z panelu administracyjnego.

Jak zablokować wykonywanie PHP w Nginx?

Nginx nie obsługuje plików .htaccess. Regułę trzeba dodać do konfiguracji właściwego bloku server, zwykle w pliku konfiguracyjnym witryny.

  1. Otwórz konfigurację serwera dla domeny i znajdź właściwy blok server.
  2. Dodaj w nim regułę blokującą pliki PHP w katalogu uploads:
location ~* /wp-content/uploads/.*\.php$ {
    deny all;
}
  1. Sprawdź poprawność konfiguracji poleceniem nginx -t.
  2. Jeśli test zakończy się powodzeniem, przeładuj konfigurację lub zrestartuj usługę, na przykład poleceniem systemctl reload nginx.

Regułę umieść przed ogólną lokalizacją obsługującą pliki PHP, jeśli konfiguracja zawiera bardziej ogólne dyrektywy typu location ~ \.php$. W przeciwnym razie żądanie może zostać obsłużone przez standardowy mechanizm przekazujący plik do PHP-FPM.

Co zrobić, jeśli strona przestanie działać?

Blokada nie powinna wpływać na zwykłe obrazy ani dokumenty. Problem może pojawić się wtedy, gdy wtyczka przechowuje w uploads pliki PHP lub próbuje uruchamiać je z tego katalogu. Dotyczy to czasem generatorów PDF, narzędzi optymalizujących obrazy albo rozszerzeń napisanych bez zachowania właściwego podziału katalogów.

Najczęstsze objawy i działania diagnostyczne to:

  • Błąd 403 w logach – sprawdź, jaki adres URL został zablokowany i która wtyczka go wywołała.
  • Niedziałający generator lub importer – zweryfikuj, czy rozszerzenie nie przechowuje wykonywalnych plików w katalogu mediów.
  • Problem po zmianie konfiguracji Nginx – uruchom nginx -t i sprawdź dziennik błędów serwera.
  • Brak pewności co do źródła błędu – tymczasowo przywróć kopię pliku konfiguracyjnego, przetestuj stronę i ustal konkretne żądanie powodujące problem.

Najbezpieczniej wprowadzić zmianę najpierw na środowisku stagingowym. Jeśli musisz tymczasowo wyłączyć blokadę na produkcji, ogranicz ten czas do diagnozy, usuń podejrzane pliki PHP z uploads i włącz regułę ponownie po zakończeniu testów.

Blokowanie PHP w katalogu z przesyłanymi plikami nie zastępuje aktualizacji WordPressa, wtyczek i motywów, ale ogranicza skutki części włamań. Dla typowej instalacji warto objąć tą zasadą także inne katalogi przeznaczone wyłącznie na pliki statyczne, o ile nie koliduje to z działaniem używanych rozszerzeń.

Redakcja wpinternals.pl

WordPressa znamy od kuchni – budujemy na nim strony, migrujemy serwisy i optymalizujemy ich wydajność. Piszemy o wtyczkach, motywach, hostingu i bezpieczeństwie tak, by poradzili sobie także początkujący. Dbamy o to, by Twoja strona była szybka, stabilna i bezpieczna.

Może Cię również zainteresować

Potrzebujesz więcej informacji?