WordPress REST API: dlaczego blokować tylko niezalogowane żądania, zamiast wyłączać ją całkowicie

Informacja o linkach partnerskich v3.1
Informacja o linkach partnerskich v3.2 (wersja mobilna)

WordPress REST API pokazuje nazwy użytkowników Twojej witryny przez adres wp-json nawet niezalogowanym odwiedzającym. Całkowite wyłączenie może sprawić, że zapis w edytorze blokowym się nie powiedzie, dlatego poniżej opisuję, jak blokować tylko niezalogowane żądania i sprawdzić to po odpowiedzi 401.

1️⃣ Czym jest WordPress REST API: adres wp-json i jego zadania

WordPress REST API to wbudowana funkcja WordPressa, która wymienia dane witryny, takie jak wpisy, strony i użytkownicy, w formacie JSON i odpowiada pod /wp-json/ po adresie witryny.

Pod /wp-json/ adresy dzielą się według rodzaju danych, np. [wp/v2/posts], [wp/v2/pages] i [wp/v2/users], a każdy z nich nazywa się endpointem. Edytor blokowy również wysyła żądania na te adresy, gdy zapisuje wpis.

https://example.com/wp-json/
https://example.com/wp-json/wp/v2/posts
https://example.com/wp-json/wp/v2/pages
https://example.com/wp-json/wp/v2/users

2️⃣ Nazwy użytkowników ujawniane przez wp-json

  • ↪️ Dlaczego blokować: users 401 · widać też na stronach autora

Endpoint [wp/v2/users] zwraca nazwę wyświetlaną i slug każdego użytkownika, który opublikował wpisy, a domyślnie slug zawiera po prostu login. Na koncie administratora witryny testowej https://testpilotweb.com/ slug i login również były takie same.

Gdy login jest ujawniony, atakującemu wystarczy zdobyć hasło, by się zalogować, a na ekranie logowania WordPressa w witrynie testowej tylko 7 października 2026 zarejestrowano 2570 prób ataku brute force.

Nawet po zablokowaniu tego adresu ten sam login zostaje w adresie strony autora (/author/login/).

3️⃣ Co się psuje po całkowitym wyłączeniu

  • ↪️ Zapis w edytorze blokowym · MCP pokazuje 0 narzędzi

Całkowite wyłączenie WP REST API najpierw psuje zapis wpisów w edytorze blokowym, dlatego Perfmatters, jedna z wtyczek optymalizacyjnych do WordPressa, dzieli wyłączanie na dwa poziomy: [Disable for Non-Admins] i [Disable When Logged Out]. W witrynach z kontami autorów lub współpracowników [Disable for Non-Admins] blokuje też zapis wpisów z tych kont.

Nawet w witrynie, która blokowała tylko niezalogowane żądania, po podłączeniu konektora MCP w claude.ai i zakończeniu uwierzytelniania pojawiło się 0 narzędzi. W logu serwera wszystkie żądania MCP miały kod 401, a przyczyną było to, że Perfmatters blokował żądanie, zanim MCP sprawdził token.

Wartość [Disable REST API]Adres users dla niezalogowanych odwiedzającychZapis wpisów z kont innych niż administratorKiedy pasuje
Default (Enabled)Nazwy użytkowników widoczneZapis działa—
Disable for Non-Admins401Zapis się nie udajeWitryny bez kont autorów i współpracowników
Disable When Logged Out401Zapis działaWitryny z kontami autorów; dla połączeń z tokenem, np. MCP, dodaj ścieżkę wyjątku

4️⃣ Blokowanie tylko niezalogowanych żądań (Perfmatters)

  • ↪️ Gdzie to ustawić · sprawdzenie odpowiedzi 401

W panelu WordPressa przejdź do [Settings] → [Perfmatters] → [General], w sekcji [Core] zmień [Disable REST API] na [Disable When Logged Out] i kliknij [Save Changes].

WordPress Settings → Perfmatters → General(WordPress REST API)
Perfmatters Disable REST API: Disable When Logged Out

Języki obsługiwane przez Perfmatters: angielski (domyślny), koreański, niemiecki, francuski, włoski, niderlandzki, portugalski (Brazylia), rosyjski, ukraiński, turecki, bułgarski, węgierski, indonezyjski, perski, chiński (uproszczony)

Perfmatters settings simulator: General → Core
Symulator ustawień Perfmatters · Perfmatters – recenzja · poradnik

Gdy otworzysz /wp-json/wp/v2/users w oknie incognito bez logowania, wróci odpowiedź 401 z komunikatem [Sorry, you do not have permission to make REST API requests.], a edytor blokowy po zalogowaniu nadal normalnie zapisuje wpisy.

🔌 To samo żądanie, dwie odpowiedzi GET /wp-json/wp/v2/users
Witryna bez blokady
200
Nawet niezalogowani odwiedzający widzą nazwy użytkowników.
[
  {
    "id": 1,
    "name": "User A",
    "slug": "user_a",
    "link": "https://example.com/author/user_a/"
  }
]
Witryna z [Disable When Logged Out]
401
Żądania bez logowania dostają odpowiedź 401 z komunikatem.
{
  "code": "rest_authentication_error",
  "message": "Sorry, you do not have permission to make REST API requests.",
  "data": { "status": 401 }
}
slug Domyślnie slug zawiera po prostu login.
Po lewej są tylko cztery pola z odpowiedzi (id · name · slug · link), a nazwa to przykład (user_a).


5️⃣ Wyjątki dla zablokowanych ścieżek

  • ↪️ Wyjątek dla ścieżki MCP · różnica względem usuwania linków REST API

Jeśli przy włączonej blokadzie trzeba otworzyć tylko jedną ścieżkę, dodaj ją do filtra [perfmatters_rest_api_exceptions] w Perfmatters. Problem 0 narzędzi w konektorze MCP claude.ai rozwiązał fragment kodu PHP w menu [Code] Perfmatters, który jako wyjątek ustawia tylko ścieżkę MCP.

add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
    $exceptions[] = '/mcp/mcp-oauth-server';
    return $exceptions;
});

Nawet po dodaniu wyjątku żądania bez tokena blokuje sam MCP komunikatem [MCP authentication required.] i odpowiedzią 401, a /wp-json/wp/v2/users dalej zwraca odpowiedź 401 z Perfmatters.

🚦 Kolejność, przez którą przechodzi żądanie
Przed wyjątkiem · żądanie MCP
Żądanie wysłane przez konektor MCP claude.ai po uwierzytelnieniu, przy włączonym [Disable When Logged Out].
Perfmatters
Zablokowane kodem 401
→↓
Sprawdzenie tokena MCP
Nie dociera
→↓
Wynik
0 narzędzi
Po dodaniu wyjątku · żądanie MCP
/mcp/mcp-oauth-server – ta ścieżka jest dodana do wyjątków Perfmatters.
Perfmatters
Przechodzi jako ścieżka wyjątku
→↓
Sprawdzenie tokena MCP
MCP sam sprawdza
→↓
Wynik
401 bez tokena
[MCP authentication required.]
Po dodaniu wyjątku · /wp-json/wp/v2/users
Ścieżki spoza wyjątków pozostają zablokowane.
Perfmatters
Zablokowane kodem 401
→↓
Wynik
Nazwy użytkowników nadal ukryte
⚠️ Perfmatters blokuje żądanie, zanim MCP sprawdzi token.

[Remove REST API Links] w tej samej sekcji [Core] usuwa tylko link api.w.org z nagłówka strony i nagłówków odpowiedzi; sama WP REST API dalej odpowiada.

🔢 FAQ & polecane treści

xmlrpc.php to inny adres niż REST API, więc odpowiada nawet przy zablokowanym REST API. W witrynie testowej tylko 8 października 2026 zarejestrowano 734 żądania POST do xmlrpc.php, a w Perfmatters zablokujesz to opcją [Disable XML-RPC] w tej samej sekcji [Core].

WP Rocket trzyma adresy /wp-json/ na liście wykluczeń z cache, więc odpowiedzi REST API zmieniają się od razu po zapisaniu. Ustawienia zmieniające HTML strony, takie jak [Remove REST API Links], działają dopiero po wyczyszczeniu cache.

Nie. Edytor blokowy WordPressa wysyła żądania do REST API przy zapisywaniu wpisów, a konektory MCP łączące narzędzia AI, takie jak claude.ai, też korzystają ze ścieżek pod /wp-json/.

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 7   +   2   =