WordPress: Jak wyłączyć anonimowy dostęp do REST API oraz zablokować enumerację użytkowników
Doświadczeni mentorzy, aktywna społeczność i ponad 152 poradniki w jednym miejscu!
Dołącz i zacznij zarabiać online!
Każda nowa wersja systemu zarządzania treścią (CMS) WordPress wprowadza udoskonalenia platformy pod względem bezpieczeństwa przechowywania oraz dostępu do wrażliwych danych użytkowników. Funkcja Rest API została dodana w wersji 4.7 wordpress’a i jest przydatnym narzędziem dla programistów. Niestety przy okazji, całkiem anonimowo, umożliwia osobom z zewnątrz sprawdzenie ID (numer identyfikacyjny) użytkowników oraz każdego zarejestrowanego loginu, a nawet sumy kontrolnej gravatarów! Osoby niepożądane mogą wyświetlić także posty, strony czy media osadzone wewnątrz systemu. By poznać te wartości, wystarczy w pasku adresu dopisać ściężkę dostępową, np. getpaid20.pl/wp-json/wp/v2/users (tutaj jest zablokowane oczywiście – ale przejrzyjcie inne strony na WP, zwłaszcza starsze:)).
W tym wpisie przedstawiam jak pozbyć się tej luki, czyli jak wyłączyć anonimowy dostęp do REST API oraz zablokować enumerację użytkowników. Nie jestem fanem wtyczek-zapychaczy, w takim razie jeżeli mogę zrobić coś z pominięciem pluginu – robię to. Tak też zrobiłem w tym przypadku 😉 Zapraszam do lektury i zachęcam do wdrożenia tych zabezpieczeń na swoich stronach.
Wyłączamy anonimowy dostęp do REST API – wordpress
UWAGA: Jeżeli potrzebujesz włączone API, to oczywiście tego nie rób, nie wyłączaj. Jeśli jednak nie miałeś/aś nawet pojęcia co to jest – najlepiej wyłączyć Zdecydowana większość osób nie używa REST API i w celu zabezpieczenia swojego wordpress’a, zalecam wyłączenie.
W tym celu:
- Instalujemy wtyczkę My Custom Functions
- Plugin: My Custom Functions
- Opis: Łatwe i bezpieczne dodawanie niestandardowego kodu PHP bez ingerencji w plik functions.php
- Link: https://wordpress.org/plugins/my-custom-functions
- Moja opinia: MUST HAVE! Mam ten plugin na absolutnie każdej swojej stronie!
Są dwie możliwości dostania się od ustawień wtyczki gdzie wprowadzisz zmiany:
- Wtyczki -> Zainstalowane wtyczki -> My Cystom Functions -> Settings
- Ustawienia -> PHP Inserter
Obojętnie którą z wyżej wymienionych możliwości wybierzemy, w zakładce „Main” wklejamy kod:
add_filter( 'rest_endpoints’, '__return_empty_array’ );
Po wklejeniu powyższego kodu:
-
- Po prawej stronie zmieniamy przełącznik na wartość „ON” (tylko wtedy zmiany będą działały!)
- Zapisujemy zmiany (Save changes)
Jeśli wszystko zrobiłeś/aś tak jak należy, po przejściu pod adres wp-json/wp/v2/users powinna pokazać się taka informacja:
Blokowanie enumeracji użytkowników
WordPress jest wyposażony w tzw. funkcję enumeracji. To znaczy, że każdy użytkownik w bazie danych ma przypisany numer identyfikacyjny – ID. Domyślnie od 1 (admin) do ∞ (nieskończoność). W takim razie nawet jeśli REST API będzie wyłączone i z jego pomocą nie da rady ustalić listy zarejestrowanych użytkowników, osoby niepożądane mogą użyć skryptu, który po kolei będzie wpisywał kolejne numery do paska adresu (/?author=x, gdzie ’x’ to cyferka) – i w ten sposób znajdzie loginy użytkowników na naszej stronie. Dlatego zalecam również zablokowanie enumeracji użytkowników.
W tym celu logujemy się na swój serwer FTP i edytujemy plik .htaccess, który znajduje się w głównym folderze strony (tam gdzie index.php). W tym pliku, bezpośrednio nad </IfModule>, wklejamy poniższy kod:
RewriteCond %{QUERY_STRING} ^author=([0-9]*)
RewriteRule .* https://ADRES-TWOJEJ-STRONY.PL/? [L,R=302]
ADRES-TWOJEJ-STRONY.PL – w tym miejscu wpisujemy domenę swojej strony! Cały kod .htaccess powinien wyglądać następująco:
# BEGIN WordPress
RewriteEngine On
RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]RewriteCond %{QUERY_STRING} ^author=([0-9]*)
RewriteRule .* https://ADRES-TWOJEJ-STRONY.PL/? [L,R=302]# END WordPress
Od tej pory gdy ktoś z zewnątrz będzie chciał ustalić loginy zarejestrowanych użytkowników, zostanie automatycznie przekierowany na stronę główną. Dokładniej rzecz biorąc, zostanie przekierowany tam gdzie wskażemy – zamiast https://ADRES-TWOJEJ-STRONY.PL/ można ustawić inny adres do przekierowania. Dowolny 😉
Do edycji .htaccess mogę też polecić wtyczkę Htaccess File Editor – Safely Edit Htaccess File (https://wordpress.org/plugins/wp-htaccess-editor)
- Testowanie poprawności przed zapisaniem
- Automatyczne kopie
- Możliwość wgrania backupu (z poziomu pluginu lub FTP)
- Wspiera sieć stron WordPress (tzw. WordPress Multisite)
Podsumowanie
Wyłączone REST API oraz zablokowana enumeracja użytkowników skutkuje zwiększeniem bezpieczeństwa swojego wordpress’a. Oczywiście należy też pamiętać o zmianie loginu administratora. Nie można sobie pozwolić na taki rarytas jak login „admin” lub „administrator”, ponieważ to również jest proszenie się o próbę włamania do panelu administracyjnego. Zabezpieczeń wordpress’a jest bardzo dużo i warto się tym interesować. To najpopularniejszy CMS, a więc i najpopularniejszy kąsek dla internetowych przestępców. Więcej o zabezpieczaniu wordpress’a dowiecie się także z mojego podcastu dla Mylead: https://www.youtube.com/embed/aEw-SAK-PfI
Pozdrawiam
Harry
Niby człowiek wiedział, a jednak się nie zabezpieczał. Dzięki za ten wpis, moje wszystkie stronki na WP już zedytowane!
Cześć Michał!
Bardzo dobra wiadomość 🙂
Pozdrawiam
Czy popularna wtyczka „Contact Form 7” nie korzysta z REST API? Gdzieś spotkałem taką informację.
Wyłączenie REST API wyłączy też jeśli się nie mylę Gutenberga. Przynajmniej na CPT gdy wyłączam to jest on również dezaktywowany…
Contact Form 7 od wersji 4.8 korzysta z REST API by obsługiwać technologię AJAX czyli ładowanie dynamiczne bez przeładowania strony. Co do gutenberga – jest całkowicie obsługiwany przez REST API i wyłączenie tej funkcjonalności powoduje, że gutenberg z automatu przestanie działać, ponieważ korzysta z wp_update_post() do tworzenia i aktualizowania postów.
Niestety ale czasem ciężko wybrać między wygodną, funkcjonalnością i bezpieczeństwem strony, dlatego ostatecznie należy rozważyć wszystkie pozytywy i negatywy lub przetestować, a następnie wyciągnąć wnioski