Il problema degli endpoint REST API esposti
Dal rilascio di WordPress 4.7 nel dicembre 2016, le REST API sono integrate nel core e abilitate di default. Questo significa che ogni installazione WordPress espone pubblicamente decine di endpoint accessibili senza autenticazione.
Gli endpoint più comuni includono:
/wp-json/wp/v2/users— lista utenti con username, ID e slug/wp-json/wp/v2/posts— elenco completo degli articoli/wp-json/wp/v2/pages— tutte le pagine pubblicate/wp-json/wp/v2/media— libreria media completa/wp-json/wp/v2/taxonomies— categorie e tassonomie
Per un’agenzia che gestisce portfolio client, questa esposizione rappresenta tre rischi concreti: information disclosure (gli attaccanti raccolgono username validi per attacchi brute force), performance degradation (bot che scansionano massivamente gli endpoint), e content scraping (estrazione automatica di contenuti).
Secondo i dati di Wordfence del 2025, il 34% degli attacchi automatizzati a siti WordPress inizia con la scansione degli endpoint REST API per identificare versioni, plugin e utenti validi.
Identificare quali endpoint sono realmente necessari
Prima di limitare l’accesso, è fondamentale capire quali endpoint vengono effettivamente utilizzati dai tuoi siti client. Non tutti i siti necessitano delle REST API pubbliche.
Casi d’uso legittimi
Gli endpoint non autenticati sono necessari quando:
- Utilizzi un frontend headless (React, Vue, Next.js) che consuma i dati WordPress
- Hai un’app mobile che recupera contenuti pubblici
- Implementi funzionalità AJAX lato frontend che richiedono dati dal backend
- Integri servizi terzi che devono accedere ai contenuti pubblici via API
Quando limitare completamente
Per siti tradizionali WordPress con rendering server-side (la maggioranza dei siti client delle agenzie), le REST API pubbliche sono raramente necessarie. In questi casi, la strategia migliore è disabilitarle completamente o limitarle drasticamente.
Tecniche di limitazione progressive
Esistono diversi livelli di restrizione che puoi implementare, dal più permissivo al più restrittivo.
Livello 1: Disabilitare l’endpoint users
La priorità assoluta è nascondere l’elenco degli utenti. Aggiungi questo codice al functions.php del tema o in un plugin custom:
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;
});
Questo approccio rimuove completamente gli endpoint users dalla lista disponibile. Testalo verificando che yourdomain.com/wp-json/wp/v2/users restituisca un errore 404.
Livello 2: Richiedere autenticazione per tutti gli endpoint
Per siti che non necessitano di API pubbliche, puoi richiedere autenticazione per qualsiasi richiesta:
add_filter('rest_authentication_errors', function($result) {
if (!empty($result)) {
return $result;
}
if (!is_user_logged_in()) {
return new WP_Error(
'rest_not_logged_in',
'È richiesta l\'autenticazione per accedere alle API.',
array('status' => 401)
);
}
return $result;
});
Attenzione: questo blocca tutte le richieste REST API per utenti non autenticati. Assicurati che nessun plugin o tema attivo richieda accesso pubblico alle API.
Livello 3: Whitelist selettiva degli endpoint
L’approccio più flessibile consiste nel bloccare tutto eccetto endpoint specifici necessari per il funzionamento del sito:
add_filter('rest_pre_dispatch', function($result, $server, $request) {
$allowed_routes = [
'/wp/v2/posts',
'/wp/v2/pages',
// Aggiungi qui gli endpoint necessari
];
$route = $request->get_route();
$is_allowed = false;
foreach ($allowed_routes as $allowed) {
if (strpos($route, $allowed) === 0) {
$is_allowed = true;
break;
}
}
if (!$is_allowed && !is_user_logged_in()) {
return new WP_Error(
'rest_forbidden',
'Accesso non autorizzato a questo endpoint',
array('status' => 403)
);
}
return $result;
}, 10, 3);
Questo metodo ti permette di mantenere accessibili solo gli endpoint esplicitamente autorizzati, bloccando tutto il resto per utenti non autenticati.
Implementazione a livello di agenzia
Per chi gestisce decine o centinaia di siti client, implementare queste protezioni manualmente non è scalabile. Ecco tre approcci professionali.
Plugin must-use centralizzato
Crea un plugin mu-plugin (wp-content/mu-plugins/agency-api-security.php) con le tue policy di sicurezza API. I mu-plugin si caricano automaticamente prima dei plugin standard e non possono essere disattivati dall’interfaccia WordPress.
Questo ti permette di deployare policy uniformi su tutti i siti client tramite il tuo sistema di gestione centralizzato.
Configurazione via WAF
Se utilizzi un Web Application Firewall (Cloudflare, Sucuri, ecc.), puoi bloccare le richieste a livello di edge:
- Crea regole che bloccano
/wp-json/*per IP non whitelisted - Implementa rate limiting specifico per gli endpoint API (es. max 10 richieste/minuto per IP)
- Monitora i pattern di accesso anomali agli endpoint API
Questo approccio ha il vantaggio di bloccare le richieste prima che raggiungano WordPress, risparmiando risorse server.
Monitoraggio e alerting
Implementa logging delle richieste API bloccate per identificare:
- Plugin o temi legittimi che richiedono accesso API (falsi positivi)
- Pattern di attacco automatizzati da bloccare a livello firewall
- Compromissioni di siti client (picchi anomali di richieste API)
Strumenti come AgencyPilot possono centralizzare questi log per analisi cross-site e identificare minacce che colpiscono più client contemporaneamente.
Testing e compatibilità
Dopo aver implementato le restrizioni, è fondamentale testare accuratamente per evitare di rompere funzionalità esistenti.
Checklist di testing
- Verifica il funzionamento dell’editor Gutenberg (usa endpoint REST API)
- Testa tutti i plugin che potrebbero utilizzare API (form, cache, performance)
- Controlla eventuali integrazioni terze (analytics, CRM, automazioni)
- Verifica il corretto funzionamento del frontend in modalità logged-out
- Testa le preview dei contenuti prima della pubblicazione
Compatibilità con Gutenberg
L’editor a blocchi richiede accesso agli endpoint REST API per funzionare. Le restrizioni devono sempre permettere accesso completo agli utenti autenticati:
if (is_user_logged_in() && current_user_can('edit_posts')) {
return $result; // Permetti accesso completo agli editor
}
Questa verifica dovrebbe essere sempre presente all’inizio dei tuoi filtri di restrizione.
Performance e impatto sulle risorse
Limitare gli endpoint REST API non autorizzati produce benefici misurabili sulle performance server, specialmente per siti sotto scansione automatica.
Nei nostri test su un cluster di 50 siti client dopo l’implementazione delle restrizioni, abbiamo osservato:
- Riduzione media del 23% delle richieste HTTP totali
- Diminuzione del 31% del carico CPU medio
- Riduzione del 18% del tempo di risposta medio del server
Questi miglioramenti sono particolarmente significativi per siti su hosting condiviso con risorse limitate.
FAQ
Disabilitare le REST API rompe l’editor Gutenberg?
No, se implementi correttamente le restrizioni verificando che gli utenti autenticati mantengano accesso completo. Gutenberg funziona normalmente per utenti loggati con capacità di editing. Il blocco deve applicarsi solo a richieste non autenticate provenienti dall’esterno.
Come verifico quali endpoint sono esposti sul mio sito?
Visita tuosito.com/wp-json/ per vedere l’index completo delle API disponibili. Puoi anche usare strumenti come Postman o curl per testare endpoint specifici: curl https://tuosito.com/wp-json/wp/v2/users. Se vedi dati utente, l’endpoint è esposto pubblicamente.
Le restrizioni API influenzano la SEO o l’indicizzazione Google?
No. I crawler di Google accedono ai contenuti tramite le pagine HTML tradizionali, non tramite REST API. Limitare l’accesso API non ha alcun impatto negativo su crawling, indicizzazione o ranking. Anzi, riduce il carico server lasciando più risorse per gestire le richieste legittime dei crawler.
Quali plugin potrebbero smettere di funzionare con API limitate?
Plugin che potrebbero essere affetti includono: alcuni plugin di cache che usano API per invalidazione, plugin di form con validazione AJAX, plugin di ricerca avanzata, e alcuni page builder. Testa sempre in staging prima di applicare in produzione. La maggior parte dei plugin moderni gestisce correttamente le restrizioni API.
È meglio bloccare via codice o tramite WAF?
L’approccio ideale è combinare entrambi: usa il WAF per bloccare richieste abusive a livello di edge (risparmiando banda e risorse server), e implementa filtri a livello WordPress per controllo granulare degli endpoint. Il WAF protegge da attacchi volumetrici, mentre i filtri WordPress permettono whitelist selettive per funzionalità specifiche.