Jeśli odwiedzisz URL folderu na swojej witrynie, na przykład https://twojadomena.pl/wp-content/uploads/2024/, dzieje się jedna z trzech rzeczy. Widzisz czystą białą stronę WordPress (ponieważ index.php przejmuje), widzisz stronę "403 Forbidden", lub widzisz coś, co wygląda jak przeglądarka FTP: listę każdego pliku w tym folderze, z rozmiarami i znacznikami czasu. Trzeci przypadek jest problemem, o którym ten przewodnik mówi.
Directory listing (zwany również "directory browsing" lub "directory indexing") to funkcja webserwera, która automatycznie wyświetla indeks HTML, gdy nie znaleziono index.html lub index.php w folderze. Na statycznej witrynie jest to okazjonalnie przydatne. Na witrynie WordPress jest to prawie zawsze wyciek. Ten przewodnik wyjaśnia, co konkretnie wycieka, dlaczego to ma znaczenie i jak prawidłowo wyłączyć funkcję na Apache, nginx i różnych managed WordPress hostach.
Co naprawdę wycieka, gdy directory listing jest włączony?
Większość folderów WordPress zawiera co najmniej jeden plik, który jest interesujący dla atakującego, konkurenta lub po prostu ciekawskiego gościa. Realistyczne najgorsze scenariusze:
/wp-content/uploads/zawiera każdy plik media kiedykolwiek przesłany, zorganizowany według roku i miesiąca. Z włączonym listingiem każdy może zobaczyć PDF-y, które zostały "odłączone", ale nigdy nie usunięte, szkice obrazów, dokumenty klientów i wszelkie prywatne pliki, które redaktor przesłał, zakładając, że "tajemniczy URL" wystarczy jako ochrona./wp-content/plugins/ujawnia dokładną listę zainstalowanych wtyczek na witrynie, w tym te, które są zdezaktywowane, ale nie usunięte. To precyzyjna lista zakupów podatności dla każdego skanera./wp-content/backup/,/backups/,/wp-content/uploads/backups/i podobne foldery to typowe miejsca docelowe dla wtyczek kopii zapasowych. Jeśli listing jest włączony, pełne dumpy baz danych i spakowane kopie zapasowe witryny są bezpośrednio do pobrania.- Foldery motywów często zawierają stare wersje
style.css, pozostałe pliki SCSS, ukryte strony testowe i notatki dewelopera, które nigdy nie były przeznaczone do publicznego użytku. - Foldery główne witryny mogą pokazywać
wp-config.php.bak, pliki swap edytorów (.swp), foldery.git/z nieudanego deploya i podobne pozostałości po sprzątaniu.
Wrażliwe pliki w tych folderach są tam zwykle, ponieważ ktoś szybko je przesłał, chciał później usunąć i zapomniał. Dopóki folder nie wymienia zawartości, nikt ich nie znajdzie. W momencie włączenia listingu każdy URL w tych folderach jest jednym kliknięciem od indeksowania przez wyszukiwarkę lub zebrania przez skaner.
Jak sprawdzić, czy directory listing jest włączony na Twojej witrynie
Najszybszy test zajmuje dziesięć sekund. Otwórz te URL-e w prywatnym oknie:
https://twojadomena.pl/wp-content/https://twojadomena.pl/wp-content/uploads/https://twojadomena.pl/wp-content/plugins/https://twojadomena.pl/wp-includes/
To, co chcesz zobaczyć, to strona 403 Forbidden lub, w przypadku /wp-content/, pusta biała strona (to pusty index.php WordPress wykonujący swoją pracę). Tym, czego nie chcesz zobaczyć, jest lista plików. Jeśli ją widzisz, listing jest włączony dla tego folderu. InspectWP również wykonuje tę kontrolę przy każdym skanie i oznacza dotknięte foldery w sekcji bezpieczeństwa.
Opcja 1: Wyłącz directory listing na Apache (i LiteSpeed)
Dyrektywa Apache, która kontroluje to zachowanie, nazywa się Options, z wartością Indexes włączającą listing i Options Indexes odrzucaną przez zapisanie tego bez wiodącego plus, plus znak minus w samej dyrektywie. Dodaj następujące do pliku .htaccess w katalogu głównym WordPress, nad znacznikiem # BEGIN WordPress:
Options -IndexesTa jedna linia wyłącza listing w jednym ujęciu dla całej instalacji WordPress. Stosuje się do każdego folderu pod document root, chyba że bardziej specyficzna reguła głębiej w drzewie ją nadpisuje.
Jeśli Twój host całkowicie blokuje Options w .htaccess (niektóre shared hostery to robią ze względów wydajności), masz dwie alternatywy:
- Umieść pusty
index.phplubindex.htmlw każdym folderze, który chcesz zablokować. WordPress robi to już dla/wp-content/,/wp-content/plugins/i kilku innych, ale nie dla/wp-content/uploads/. Pusty plik powoduje, że Apache serwuje ten plik zamiast listować folder. - Poproś swojego hosta o włączenie dyrektywy
Optionsdla Twojego konta. Większość managed hostów robi to na żądanie.
Trik index.php jest prosty, ale łatwy do zrobienia źle: musisz pamiętać, aby dodać plik do każdego nowo utworzonego folderu, w tym folderów rok/miesiąc, które WordPress tworzy automatycznie dla nowych uploadów. Reguła webserwera nie ma tego problemu.
Opcja 2: Wyłącz directory listing na nginx
Na nginx directory listing jest kontrolowany przez dyrektywę autoindex. Domyślnie jest na off w większości instalacji, więc na standardowej konfiguracji nginx problem nie istnieje. Foldery, które odwiedzasz, spadają do 403, gdy nie ma pliku indeksu.
Jeśli listing jest włączony, ktoś go w pewnym momencie wyraźnie włączył. Wyszukaj autoindex on; w nginx.conf, w bloku server witryny lub w dowolnym dołączonym pliku conf.d. Usuń linię lub zmień ją na:
autoindex off;Przeładuj nginx za pomocą sudo nginx -t && sudo systemctl reload nginx. Następne żądanie folderu otrzyma 403 zamiast listy plików.
Jeśli nie możesz przeładować nginx (zablokowany managed hosting), ten sam trik index.php z sekcji Apache działa również na nginx, ponieważ nginx z radością serwuje istniejący plik indeksu, zanim wróci do autoindex.
Opcja 3: Managed WordPress hosting
Managed hosty (Raidboxes, Kinsta, WP Engine, Cloudways, Pressable itd.) zwykle wyłączają directory listing domyślnie na poziomie serwera. Jeśli zauważysz, że jeden z tych hostów ma listing włączony mimo wszystko na Twoim koncie, szybki ticket wsparcia jest właściwym działaniem. Mają dostęp do centralnej konfiguracji nginx i mogą to naprawić w kilka minut. Próba obejścia tego z WordPress na managed hoście rzadko jest warta zachodu.
Zauważ, że niektóre hosty używają warstwy CDN (Cloudflare, KeyCDN, Bunny), która cache'uje żądania folderów. Jeśli zmienisz konfigurację serwera i nadal widzisz listę plików, CDN może serwować zbuforowaną wersję. Opróżnij cache dla dotkniętych ścieżek i przetestuj ponownie.
Częsty błąd: ochrona wp-content/uploads za pomocą .htaccess
Wzorzec, który pojawia się w starszych przewodnikach, to umieszczenie osobnego .htaccess bezpośrednio w wp-content/uploads/ z długą listą reguł. Intencja jest dobra, ale skutki uboczne są niechlujne: w zależności od tego, co reguły zawierają, uploady obrazów mogą przestać się ładować, lazy loading może się zepsuć, lub PDF-y mogą stać się niedostępne. Jeśli chcesz tylko wyłączyć listing, pojedyncza linia Options -Indexes w głównym .htaccess wystarczy. Działa rekurencyjnie. Osobne pliki na folder nie są potrzebne, chyba że masz do tego konkretny powód.
Co z ukrywaniem plików również przed wyszukiwarkami?
Wyłączenie directory listing zapobiega serwowaniu indeksu folderu, ale nie powstrzymuje wyszukiwarki przed indeksowaniem poszczególnych plików w folderze, jeśli są one linkowane gdziekolwiek z publicznego internetu. Jeśli masz wrażliwe pliki w wp-content/uploads/, których nie chcesz widzieć w Google, usunięcie pliku jest jedyną niezawodną odpowiedzią. Meta tagi noindex, reguły nagłówka X-Robots-Tag i wpisy robots.txt pomagają z odkrywaniem, ale tylko usunięcie plików gwarantuje, że treść zniknie.
Ogólna zasada, która zawsze obowiązuje dla folderu uploads: nie przesyłaj tam niczego, czego nie czułbyś się komfortowo widząc na pierwszej stronie swojej witryny. Folder jest z założenia publicznym folderem webowym.
Jak zweryfikować swoją konfigurację
- Otwórz
https://twojadomena.pl/wp-content/uploads/w prywatnym oknie. Oczekiwany rezultat: strona403 Forbiddenlub pusta strona (w zależności od tego, czy istnieje pustyindex.html). - Powtórz dla każdego innego folderu, który wcześniej znalazłeś (
/wp-content/plugins/, foldery motywów, niestandardowe foldery upload). - Jeśli widzisz listę plików, zmiana nie weszła w życie. Sprawdź, czy edytowałeś właściwy
.htaccess(wersję w katalogu głównym WordPress, nie w folderze nadrzędnym instalacji WordPress) i opróżnij wszelkie warstwy cache. - Uruchom nowy skan InspectWP. Kontrola "directory listing włączony" w sekcji bezpieczeństwa powinna być zielona.
Cała zmiana to pojedyncza linia w .htaccess na Apache lub jedno ustawienie konfiguracji na nginx. Pięć sekund pracy, i cała klasa niezamierzonego ujawniania plików znika. Warto to zrobić na każdej witrynie, nawet jeśli wszystko w Twoim folderze uploads jest obecnie w porządku. Ochrona dotyczy następnego pliku, który ktoś przesłał w pośpiechu, nie tylko plików, które już tam są.