← Wszystkie porady

Publiczny endpoint REST API /wp-json/wp/v2/users

Co to oznacza

WordPress REST API udostępnia endpoint /wp-json/wp/v2/users, który domyślnie zwraca listę użytkowników strony — w tym loginy, wyświetlane nazwy, identyfikatory i linki do profili. Jeśli ten endpoint na Twojej stronie jest publicznie dostępny bez uwierzytelnienia, każdy może pobrać listę kont.

Każdy, kto odwiedzi twojastrona.pl/wp-json/wp/v2/users, otrzyma listę kont w formacie JSON — bez potrzeby logowania.

Jakie jest ryzyko

  • Enumeracja użytkowników — atakujący uzyskuje listę prawidłowych loginów. To pierwszy krok do ataku brute-force — zamiast zgadywać login i hasło, wystarczy zgadywać samo hasło.
  • Rozpoznanie celów — informacje o kontach administratorów pozwalają precyzyjnie ukierunkować atak na konta z najwyższymi uprawnieniami.
  • Automatyzacja ataków — boty rutynowo odpytują ten endpoint, budując bazy loginów WordPress do masowych ataków credential stuffing.
  • Wyciek informacji — w odpowiedzi mogą znaleźć się adresy e-mail (w zależności od konfiguracji), opisy użytkowników i adresy URL profili.

Jak to naprawić

  1. Ogranicz dostęp do endpointu — dodaj filtr w functions.php lub wtyczce mu-plugins:
    add_filter('rest_endpoints', function($endpoints) {
        if (isset($endpoints['/wp/v2/users'])) {
            unset($endpoints['/wp/v2/users']);
        }
        if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
            unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
        }
        return $endpoints;
    });
    
  2. Wymagaj autoryzacji — zamiast usuwać endpoint, ogranicz go do zalogowanych użytkowników:
    add_filter('rest_authentication_errors', function($result) {
        if (!is_user_logged_in()) {
            return new WP_Error('rest_not_logged_in', 'Dostęp wymaga logowania.', ['status' => 401]);
        }
        return $result;
    });
    
    Uwaga: to zablokuje całe REST API dla niezalogowanych — upewnij się, że nie korzystasz z niego na frontendzie.
  3. Zablokuj na poziomie serwera — jeśli nie korzystasz z REST API publicznie, zablokuj cały endpoint /wp-json/wp/v2/users w konfiguracji Nginx/Apache.