La WordPress REST API è un'interfaccia potente che permette ad applicazioni esterne, temi e plugin di interagire con i dati del tuo sito. Per default, WordPress espone una serie di endpoint pubblici che chiunque può interrogare senza autenticazione. Sebbene utile per configurazioni headless e integrazioni di terze parti, apre anche la porta a fughe di informazioni, in particolare riguardo ai dati utente.
Cosa espone la WordPress REST API per default
Quando la REST API è completamente accessibile, diversi endpoint restituiscono dati che la maggior parte dei proprietari di siti preferirebbe mantenere privati. Gli endpoint più abusati includono:
/wp-json/wp/v2/users: restituisce una lista di tutti gli utenti che hanno pubblicato almeno un post, inclusi nome utente, nome visualizzato, ID utente, URL avatar e link archivio dell'autore./wp-json/wp/v2/users/1: restituisce informazioni dettagliate su un utente specifico in base all'ID. Gli aggressori spesso iniziano con ID 1 perché è tipicamente l'account amministratore./wp-json/wp/v2/posts: elenca i post pubblicati, insieme alle informazioni sull'autore./wp-json/wp/v2/pages: elenca tutte le pagine pubblicate, il che può rivelare la struttura interna del sito./wp-json/: l'endpoint root stesso rivela tutte le route registrate e dà agli aggressori una mappa delle capacità del tuo sito e dei plugin installati.
L'endpoint /wp/v2/users è la preoccupazione più grande per la maggior parte dei siti. Gli aggressori lo usano per l'enumerazione utenti e raccolgono nomi utente validi che usano poi in attacchi di brute force sull'accesso. Anche se usi password forti, esporre i nomi utente rimuove uno strato di difesa.
Perché non dovresti disabilitare completamente la REST API
Può essere allettante bloccare completamente la REST API, ma questo romperà varie funzionalità core di WordPress. L'editor a blocchi Gutenberg si basa pesantemente sulle chiamate REST API per caricare i dati dei blocchi, salvare il contenuto e gestire i media. Se disabiliti completamente l'API, Gutenberg non si caricherà e non potrai modificare post o pagine.
Oltre a Gutenberg, molti plugin popolari si affidano alla REST API per la loro funzionalità:
- Contact Form 7: usa endpoint REST API nelle versioni più recenti per la gestione degli invii dei moduli.
- WooCommerce: si affida alle route REST API per le operazioni del carrello, l'elaborazione del checkout e l'interfaccia di amministrazione.
- Yoast SEO: usa chiamate REST API per le sue metabox e le funzioni di analisi del contenuto nell'editor.
- Jetpack: richiede l'accesso REST API per la sua connessione ai servizi WordPress.com.
L'approccio corretto è la restrizione selettiva: blocca l'accesso pubblico agli endpoint sensibili e mantieni l'API disponibile per utenti autenticati e l'area di amministrazione WordPress.
Limita la REST API agli utenti loggati
Il metodo più efficace è richiedere l'autenticazione per tutte le richieste REST API. Aggiungi questo codice al file functions.php del tuo tema, o meglio, a un plugin personalizzato specifico per il sito:
add_filter('rest_authentication_errors', function($result) {
// If a previous authentication check already passed or failed, respect it
if (true === $result || is_wp_error($result)) {
return $result;
}
// Block unauthenticated requests
if (!is_user_logged_in()) {
return new WP_Error(
'rest_not_logged_in',
'You are not currently logged in.',
array('status' => 401)
);
}
return $result;
});Questo approccio blocca tutto l'accesso REST API per i visitatori non loggati. Gutenberg, WooCommerce e altri plugin continuano a funzionare normalmente perché le loro richieste provengono da sessioni di amministrazione autenticate. I visitatori che cercano di raggiungere /wp-json/wp/v2/users ricevono un errore 401 invece dei dati utente.
Tieni a mente: se il tuo sito usa un frontend headless o ha una funzionalità pubblica che recupera dati tramite REST API (ad esempio una funzione di ricerca dal vivo che gira su REST API), questo metodo romperà quella funzionalità. In tali casi, l'approccio selettivo qui sotto è più adatto.
Disabilita selettivamente solo l'endpoint utenti
Se vuoi mantenere la REST API accessibile per uso pubblico ma prevenire specificamente l'enumerazione utenti, puoi rimuovere solo gli endpoint utenti:
add_filter('rest_endpoints', function($endpoints) {
// Remove the users list endpoint
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
// Remove the single user endpoint
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P[\d]+)']);
}
return $endpoints;
}); Questo lascia funzionali tutte le altre route REST API mentre blocca specificamente il vettore di attacco per l'enumerazione utenti. È un buon compromesso per siti che necessitano di accesso REST API pubblico per ricerca, query di contenuto o altre funzionalità, ma vogliono proteggere i dati utente.
Rimuovi il link di discovery REST API dall'HTML
WordPress aggiunge un tag <link rel="https://api.w.org/"> nell'head HTML e un header Link nelle risposte HTTP. Questi dicono agli strumenti automatizzati dove trovare la REST API. Sebbene la rimozione di questi tag non disabiliti effettivamente l'API (gli endpoint rispondono ancora ai loro URL abituali), riduce la rilevabilità:
// Remove the REST API link from the HTML head
remove_action('wp_head', 'rest_output_link_wp_head');
// Remove the REST API link from XML-RPC responses
remove_action('xmlrpc_rpc_methods', 'rest_output_link_wp_head');
// Remove the Link header from HTTP responses
remove_action('template_redirect', 'rest_output_link_header', 11);Questo passaggio è meglio in combinazione con uno dei metodi di restrizione sopra, non da solo. Rimuovere il tag link senza limitare gli endpoint effettivi è sicurezza attraverso l'oscurità, che offre una protezione reale minima.
Usare un plugin per gestire l'accesso REST API
Se preferisci non aggiungere codice personalizzato, diversi plugin offrono un'interfaccia utente per gestire l'accesso REST API:
- Disable WP REST API: blocca tutto l'accesso REST API per richieste non autenticate con un semplice interruttore. Non è necessaria ulteriore configurazione dopo l'attivazione.
- WP REST API Controller: ti dà un controllo fine su quali endpoint sono pubblici e quali richiedono autenticazione, in modo che tu possa consentire alcune route e bloccarne altre.
L'approccio plugin è più facile da gestire ma aggiunge una dipendenza. Se il plugin viene disattivato o rimosso durante un aggiornamento, la tua REST API torna di nuovo completamente pubblica. L'approccio basato su codice è più affidabile per la protezione a lungo termine.
Testare le tue restrizioni REST API
Dopo aver applicato le tue modifiche, verifica che funzionino correttamente. Apri una finestra del browser in incognito (in modo da non essere loggato) e prova a raggiungere questi URL sul tuo sito:
https://yoursite.com/wp-json/wp/v2/usershttps://yoursite.com/wp-json/wp/v2/users/1https://yoursite.com/wp-json/
Se la tua restrizione funziona, questi dovrebbero restituire un errore 401 o una risposta vuota invece dei dati utente. Poi accedi alla tua area di amministrazione WordPress e conferma che l'editor Gutenberg, i tuoi moduli e qualsiasi funzionalità WooCommerce continuino a funzionare come previsto.
Verifica con InspectWP
Dopo aver implementato le tue modifiche, esegui una nuova scansione InspectWP sul tuo sito. La sezione sicurezza del tuo report mostra se la REST API è accessibile pubblicamente e se l'endpoint users restituisce dati. Se la restrizione funziona correttamente, InspectWP riporterà l'API come non accessibile o l'endpoint user come limitato.