WordPress REST API är påslaget på varje WordPress-installation sedan version 4.7. De flesta som kör en vanlig företagswebb vet knappt att det finns — men det exponerar ändå information om din installation mot omvärlden.
Det är inte katastrofalt i sig. Men det är en attackyta du förmodligen inte behöver.
Vad REST API faktiskt gör
REST API låter externa applikationer kommunicera med din WordPress-installation via HTTP-anrop. Det används av Gutenberg-redigeraren, WooCommerce, mobilappar och headless-setup:ar.
Om du driver en vanlig WordPress-webb med klassisk redigering, inga mobilappar och inget headless — används det troligtvis bara av Gutenberg internt. Resten av exponeringen är i princip gratis för den som vill sondera din installation.
Vad som läcker utan att du vet om det
Med standard REST API-konfiguration kan vem som helst hämta en lista på alla dina användare via:
https://dinwebb.se/wp-json/wp/v2/users
Det returnerar användarnamn, ID och ibland mer. Det är precis den informationen som används vid brute force-attacker mot inloggningen.
Det går också att lista publicerade inlägg, kategorier och en del systeminformation — utan inloggning.
Två separata problem
Det är viktigt att skilja på:
1. Användaruppräkning — att /wp-json/wp/v2/users returnerar dina användare. Det är den allvarligaste delen och bör stängas av oavsett om du behöver REST API eller inte.
2. Hela REST API:et — om du kör Gutenberg eller WooCommerce kan du inte stänga av allt. Men du kan begränsa vad oinloggade användare ser.
Stäng av användaruppräkning — alltid
Lägg det här i din functions.php eller i ett litet målfunktions-plugin:
add_filter( 'rest_endpoints', function( $endpoints ) {
if ( ! is_user_logged_in() ) {
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;
} );
Det här tar bort användarendpointen för alla som inte är inloggade. Gutenberg och autentiserade anrop påverkas inte.
Begränsa hela REST API för oinloggade
Om du inte kör WooCommerce, mobilappar eller liknande kan du gå längre och neka REST API-anrop från ej autentiserade användare:
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! is_user_logged_in() ) {
return new WP_Error(
'rest_not_logged_in',
'REST API är begränsat till inloggade användare.',
array( 'status' => 401 )
);
}
return $result;
} );
OBS: Det här bryter Gutenberg om du kör det som redigerare. Testa alltid på en staging-miljö innan du lägger det i produktion. Kör du klassisk editor och ingen e-handel — fungerar det utmärkt.
Plugins som löser det åt dig
Vill du inte skriva kod finns det plugins för det här. Disable REST API är ett välkänt alternativ med drygt 90 000 aktiva installationer. Det låter dig begränsa åtkomst per användarroll utan att röra kod.
Om du väljer plugin-vägen: kontrollera senaste uppdateringsdatum och hur många aktiva installationer det har. Ett övergett plugin för att stänga säkerhetsluckor är ironisk nog en säkerhetsrisk i sig. Mer om hur du väljer tillägg med omdöme finns på WordPress-säkerhetssidan.
Hur vet du om du berörs?
Öppna en privat flik i webbläsaren och besök:
https://dinwebb.se/wp-json/wp/v2/users
Om du ser JSON med namn och ID:n — är du exponerad. Om du får ett 401-fel eller ett tomt svar — är du redan skyddad.
Det tar 30 sekunder att kolla. Gör det nu.
Sitter du hellre med annat än att hålla koll på den här typen av detaljer? Vi sköter det löpande åt ett 50-tal WordPress-kunder — se vad som ingår i ett supportavtal.