WordPress REST API to wbudowany interfejs, który pozwala zewnętrznym aplikacjom, frontendom JavaScript, aplikacjom mobilnym i usługom stron trzecich komunikować się z Twoją witryną WordPress przez standardowe żądania HTTP i dane JSON. Został włączony do rdzenia WordPressa w wersji 4.7 (grudzień 2016) i od tego czasu stał się kręgosłupem nowoczesnego rozwoju WordPressa, napędzając wszystko od edytora bloków Gutenberg po architektury headless WordPress.
Przed istnieniem REST API jedynym programowym sposobem komunikacji z WordPressem z zewnątrz było XML-RPC, starszy i znacznie bardziej ograniczony protokół. REST API zastąpiło to podejście czymś znacznie bardziej elastycznym, ale wprowadziło też nowe kwestie bezpieczeństwa, które każdy właściciel witryny WordPress powinien zrozumieć.
Domyślne endpointy i co udostępniają
REST API znajduje się pod /wp-json/wp/v2/ w każdej instalacji WordPress. Out of the box udostępnia szeroki zakres endpointów:
/wp-json/wp/v2/posts: zwraca wszystkie opublikowane posty z ich pełną zawartością, ID autorów, kategoriami, tagami i odwołaniami do wyróżnionych obrazów./wp-json/wp/v2/pages: tak samo jak posts, ale dla statycznych stron./wp-json/wp/v2/users: pokazuje wszystkich użytkowników, którzy opublikowali co najmniej jeden post. To najbardziej wrażliwy bezpieczeństwa domyślny endpoint./wp-json/wp/v2/categoriesi/wp-json/wp/v2/tags: zwracają terminy taksonomii z opisami i liczbami postów./wp-json/wp/v2/comments: pokazuje publiczne komentarze, w tym imiona komentujących i czasem adresy email, jeśli witryna jest źle skonfigurowana./wp-json/wp/v2/media: pokazuje wgrane pliki mediów z URL-ami, wymiarami i metadanymi./wp-json/wp/v2/search: zapewnia endpoint wyszukiwania, który odzwierciedla wbudowaną funkcję wyszukiwania witryny./wp-json/(root): zwraca pełny indeks wszystkich zarejestrowanych namespace'ów i tras API, ujawniając każdą wtyczkę, która rejestruje własne endpointy API.
Wtyczki często dodają własne namespace'y. WooCommerce dodaje /wp-json/wc/v3/, Yoast SEO dodaje endpointy pod swoim namespace, a wtyczki formularzy kontaktowych mogą udostępniać endpointy wysyłki. Indeks root API ujawnia wszystkie te, dając atakującemu jasny obraz, które wtyczki są zainstalowane.
Ryzyko wyliczania użytkowników
Endpoint /wp-json/wp/v2/users to najczęściej omawiana obawa bezpieczeństwa wokół REST API. Domyślnie każdy może odwiedzić ten endpoint i otrzymać odpowiedź JSON z wszystkimi użytkownikami, którzy napisali treści. Każdy wpis użytkownika zawiera ich nazwę użytkownika (pole slug), nazwę wyświetlaną, ID użytkownika, URL avatara i link do ich archiwum autora.
Dlaczego to ważne? Ponieważ nazwy użytkowników stanowią połowę równania logowania. Jeśli atakujący wie, że Twoje konto admina używa nazwy użytkownika sarah_admin, musi tylko odgadnąć (lub brute force'ować) hasło. Bez REST API odkrywanie nazw użytkowników wymagało więcej wysiłku, na przykład zgadywania URL-i archiwum autora jak /?author=1. REST API daje te informacje swobodnie, w ustrukturyzowanym, czytelnym maszynowo formacie.
To nie jest obawa teoretyczna. Automatyczne boty rutynowo skrobią /wp-json/wp/v2/users na witrynach WordPress, aby zbudować listy celów dla ataków credential stuffing i brute force. Jeśli Twoja witryna ma użytkownika o nazwie admin, to konto jest pierwszym celem.
Metody uwierzytelniania dla REST API
Nieuwierzytelnione żądania do REST API zwracają tylko publicznie dostępne dane (opublikowane posty, publiczne profile użytkowników itp.). Aby tworzyć, aktualizować lub usuwać treści przez API, wymagane jest uwierzytelnianie. WordPress wspiera kilka metod:
- Uwierzytelnianie ciasteczkami: tego używa edytor Gutenberg. Gdy jesteś zalogowany w WordPressie, Twoja przeglądarka wysyła ciasteczka sesji z każdym żądaniem API. Wartość nonce zapobiega cross-site request forgery. Ta metoda działa tylko w kontekście przeglądarki.
- Application Passwords: wprowadzone w WordPressie 5.6, pozwalają generować unikalne hasła dla każdej aplikacji potrzebującej dostępu do API. Każde application password jest powiązane z konkretnym kontem użytkownika. Możesz je odwoływać indywidualnie bez zmiany głównego hasła. Są wysyłane przez HTTP Basic Auth i działają tylko przez HTTPS.
- JWT (JSON Web Tokens): niewbudowane w rdzeń WordPressa, ale dostępne przez wtyczki takie jak "JWT Authentication for WP REST API". JWT jest popularne dla konfiguracji headless WordPress, gdzie aplikacja frontendowa musi uwierzytelniać użytkowników i wykonywać wywołania API w ich imieniu.
- OAuth: również dostępne przez wtyczki. OAuth to preferowana metoda, gdy aplikacje stron trzecich potrzebują dostępu do API Twojej witryny w imieniu Twoich użytkowników, ponieważ zapobiega bezpośredniemu udostępnianiu haseł.
Kiedy faktycznie potrzebujesz REST API
REST API nie jest opcjonalną funkcją, którą można po prostu wyłączyć. Jest głęboko zintegrowane z rdzeniem WordPressa i wiele wtyczek od niego zależy:
- Edytor bloków Gutenberg: całe doświadczenie edycji opiera się na REST API. Za każdym razem, gdy tworzysz, zapisujesz lub przeglądasz post w edytorze bloków, komunikuje się on z REST API. Wyłączenie go zmusiłoby Cię do powrotu do Classic Editora.
- Headless WordPress: jeśli używasz WordPressa jako backendu CMS z oddzielnym frontendem w React, Vue, Next.js lub Nuxt, REST API (lub jego nowszy odpowiednik WPGraphQL) jest sposobem, w jaki frontend pobiera treści.
- Aplikacje mobilne: oficjalna aplikacja mobilna WordPress komunikuje się z Twoją stroną przez REST API. Wiele custom aplikacji dla witryn członkowskich, platform edukacyjnych lub mediów informacyjnych również go używa.
- Funkcjonalność wtyczek: wiele nowoczesnych wtyczek polega na REST API dla swoich interfejsów administracyjnych. Wtyczki używające React lub Vue dla swoich stron ustawień wykonują wywołania API w tle. WooCommerce, Jetpack, Yoast SEO i dziesiątki innych nie działałyby bez niego.
- Integracje stron trzecich: Zapier, IFTTT i podobne narzędzia automatyzacji mogą komunikować się z Twoją witryną WordPress przez REST API, umożliwiając przepływy pracy takie jak automatyczne tworzenie postów z wysyłek formularzy lub synchronizacja treści między platformami.
Hardening bezpieczeństwa bez psucia rzeczy
Właściwe podejście to nie wyłączać REST API całkowicie, ale ograniczać części, które ujawniają wrażliwe informacje. Oto praktyczne kroki:
- Ogranicz endpoint users: wymagaj uwierzytelniania dla
/wp/v2/users. Kilka wtyczek bezpieczeństwa oferuje to jednym przełącznikiem. Możesz też dodać snippet dofunctions.phpmotywu lub własnej wtyczki podpinającej się podrest_authentication_errors, aby blokować nieuwierzytelniony dostęp do określonych endpointów. - Usuń link REST API z HTML: WordPress dodaje tag
<link rel="https://api.w.org/">w head HTML, ogłaszając URL API. Usunięcie go nie wyłącza API, ale powstrzymuje rozgłaszanie lokalizacji automatycznym skanerom. - Wyłącz też XML-RPC: jeśli zabezpieczasz REST API, wyłącz też starszy interfejs XML-RPC (
/xmlrpc.php), który ma własny zestaw podatności brute force i DDoS. - Użyj wtyczki firewall: wtyczki takie jak Wordfence, Sucuri lub iThemes Security mogą ograniczać dostęp do API na podstawie adresu IP, blokować znane złośliwe boty i dodawać rate limiting, aby zapobiec automatycznemu nadużywaniu.
- Usuń nieużywane endpointy wtyczek: jeśli wtyczka rejestruje trasy API, których nie potrzebujesz, użyj filtra
rest_endpoints, aby je usunąć. To zmniejsza powierzchnię ataku i zapobiega też wyciekowi informacji o tym, jakie wtyczki masz zainstalowane.
Co sprawdza InspectWP
InspectWP sprawdza, czy REST API jest publicznie dostępne, szukając tagu <link rel="https://api.w.org/"> w kodzie źródłowym HTML Twojej strony. Dodatkowo testuje, czy endpoint /wp-json/wp/v2/users zwraca dane użytkowników bez uwierzytelniania, co wskazywałoby na ryzyko wyliczania użytkowników. Jeśli tag linku API jest obecny, InspectWP raportuje znaleziony URL REST API. Jeśli dane użytkowników są ujawnione, jest to oznaczone jako obawa bezpieczeństwa z zaleceniem ograniczenia tego endpointa tylko do uwierzytelnionych żądań.