Disattivare API REST WordPress: accesso sicuro ai dati
Le API REST di WordPress rendono disponibili alcuni contenuti pubblici tramite indirizzi come /wp-json/wp/v2/posts. Questo comportamento è normale e permette a editor, app, temi e servizi esterni di comunicare con il sito. Disattivare API REST WordPress in modo indiscriminato può però compromettere Gutenberg, plugin e integrazioni headless. La soluzione più sicura consiste nel bloccare soltanto gli endpoint sensibili, richiedere autenticazione dove serve e ridurre i campi restituiti. Gli utenti, gli articoli privati e i dati amministrativi non devono essere protetti soltanto nascondendo l’URL dell’API. Le regole vanno applicate nel codice di WordPress o nel server, verificando prima quali funzionalità dipendono dall’API.
Quali dati espone davvero l’API REST di WordPress
L’API REST di WordPress espone principalmente contenuti già pubblici, non automaticamente l’intero database. L’indirizzo /wp-json/ mostra le informazioni di base sull’API e le rotte disponibili, mentre /wp-json/wp/v2/posts restituisce gli articoli pubblicati accessibili al pubblico.
In base al tema e ai plugin installati, una risposta JSON può includere:
- Titolo, estratto, contenuto e data di pubblicazione degli articoli.
- URL canonico, autore, categorie, tag e immagini in evidenza.
- Informazioni sulle pagine pubbliche e sui tipi di contenuto personalizzati.
- Nomi degli utenti associati agli articoli, se l’endpoint degli utenti è disponibile.
- Dati aggiunti da plugin, temi o campi personalizzati registrati nell’API.
La presenza di un articolo pubblico nell’API non rappresenta, da sola, una vulnerabilità. Un visitatore può già leggere quel contenuto dal sito; il rischio aumenta quando plugin configurati male pubblicano dati interni, campi personalizzati, utenti o endpoint non necessari.
Per verificare le rotte esposte si può aprire /wp-json/ in Google Chrome o in un altro browser. La richiesta OPTIONS o gli strumenti per sviluppatori mostrano inoltre i metodi HTTP supportati, ma un controllo più affidabile richiede l’analisi dei plugin e del codice del tema.
Come limitare le API REST senza rompere WordPress
Bloccare tutte le richieste non autenticate è efficace solo per siti che non usano funzionalità pubbliche basate sull’API. Gutenberg, alcuni page builder, applicazioni mobili e installazioni headless possono richiedere le API REST anche quando l’utente non utilizza direttamente /wp-json/.
Per impedire l’accesso anonimo all’API si può aggiungere un filtro in un plugin personalizzato o in un mu-plugin. Il codice seguente restituisce un errore HTTP 401 agli utenti non autenticati:
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',
'L’accesso alle API REST richiede autenticazione.',
array( 'status' => 401 )
);
}
return $result;
} );
Questo approccio non equivale a una protezione universale. L’autenticazione tramite cookie e nonce funziona per le sessioni WordPress, mentre le applicazioni esterne possono usare le Password per applicazioni disponibili in WordPress 5.6 e versioni successive. Le integrazioni devono comunicare tramite HTTPS e utilizzare un account con i privilegi minimi necessari.
Il filtro rest_authentication_errors non dovrebbe essere inserito alla cieca nel file functions.php di un tema. Un cambio di tema può rimuoverlo e un errore PHP può rendere inutilizzabile il sito; un plugin dedicato o un mu-plugin offre un controllo più stabile.
Come bloccare soltanto gli endpoint sensibili
La limitazione selettiva è spesso preferibile a disattivare API REST WordPress completamente. L’endpoint degli utenti, per esempio, può rivelare gli account associati ai contenuti pubblici e fornire informazioni utili per tentativi di enumerazione dei nomi utente.
Per rimuovere le rotte /wp/v2/users e le relative varianti si può usare il filtro rest_endpoints:
add_filter( 'rest_endpoints', function ( $endpoints ) {
foreach ( array_keys( $endpoints ) as $route ) {
if ( preg_match( '#^/wp/v2/users(?:/|$)#', $route ) ) {
unset( $endpoints[ $route ] );
}
}
return $endpoints;
} );
Il codice elimina la rotta dall’elenco dell’API, ma non sostituisce la protezione degli account WordPress. È comunque necessario usare password robuste, autenticazione a più fattori tramite plugin affidabili, aggiornamenti regolari e ruoli con permessi ridotti.
Per limitare un tipo di contenuto personalizzato, bisogna intervenire nella registrazione del post type. L’opzione show_in_rest => false impedisce di pubblicarlo tramite l’API REST:
register_post_type( 'documenti_interni', array( 'public' => false, 'show_ui' => true, 'show_in_rest' => false, ) );
Questa impostazione è adatta a contenuti interni gestiti dal pannello di WordPress. Se un’applicazione deve leggere quei dati, la rotta dovrebbe usare una funzione permission_callback con una capacità specifica, invece di essere pubblica.
register_rest_route(
'miosito/v1',
'/documenti',
array(
'methods' => WP_REST_Server::READABLE,
'callback' => 'miosito_elenca_documenti',
'permission_callback' => function () {
return current_user_can( 'manage_options' );
},
)
);
La proprietà permission_callback è obbligatoria per le rotte REST personalizzate nelle versioni moderne di WordPress. Restituire true senza controlli rende pubblica la rotta e può esporre dati che non dovrebbero essere accessibili ai visitatori.
Come ridurre i dati restituiti dalle risposte JSON
Il parametro _fields permette di richiedere soltanto alcuni campi, per esempio /wp-json/wp/v2/posts?_fields=id,title,link. Questa tecnica riduce la quantità di dati trasferiti e può migliorare le prestazioni, ma non è un controllo di sicurezza, perché il client può modificare la richiesta e domandare altri campi autorizzati.
Per rimuovere realmente informazioni aggiuntive bisogna intervenire sui filtri rest_prepare_{post_type}. Un plugin può modificare la risposta di un tipo di contenuto prima che venga inviata, eliminando campi personalizzati non destinati al pubblico:
add_filter( 'rest_prepare_post', function ( $response ) {
if ( isset( $response->data['meta'] ) ) {
unset( $response->data['meta'] );
}
return $response;
} );
Questo esempio agisce sugli articoli standard e rimuove il blocco meta dalla risposta. Il filtro deve essere testato con i plugin attivi, perché alcuni temi o servizi possono dipendere da quei dati per mostrare correttamente contenuti e metadati.
La soluzione più affidabile è non registrare nell’API i campi riservati. Quando un plugin usa register_post_meta(), il parametro show_in_rest dovrebbe essere impostato su false per i metadati interni. Per i dati pubblici, invece, è opportuno definire una auth_callback che controlli la capacità dell’utente.
Controlli da eseguire dopo la modifica
Dopo aver limitato l’API REST, è necessario verificare sia gli accessi pubblici sia le funzioni amministrative. Un blocco eccessivo può impedire la modifica degli articoli dall’editor a blocchi o causare errori JavaScript nel pannello di WordPress.
Il controllo dovrebbe includere:
- Apertura di
/wp-json/senza autenticazione. - Verifica di
/wp-json/wp/v2/postse degli endpoint dei tipi personalizzati. - Prova dell’editor Gutenberg con un account autorizzato.
- Controllo dei plugin che usano webhook, app mobili o collegamenti esterni.
- Analisi dei log del server per individuare richieste anomale o ripetitive.
Le regole Nginx, Apache o di un firewall applicativo possono bloccare richieste provenienti da determinati indirizzi o limitare la frequenza delle chiamate. Un blocco server-side applicato a /wp-json/ è però troppo generico per molti siti WordPress e può interferire con plugin legittimi.
La protezione dell’API deve quindi essere coordinata con aggiornamenti di WordPress, plugin e tema, oltre che con backup verificati. Nascondere i link all’API nell’HTML o rimuovere la rotta dall’indice non impedisce a un client di chiamare direttamente un endpoint ancora attivo.
Disattivare API REST WordPress è sicuro solo quando la limitazione corrisponde alle reali esigenze del sito e viene verificata dopo ogni modifica.
Potrebbe interessarti anche:
- Plugin o Codice: Disattivare API REST in WordPress
- Sito WordPress che si blocca ogni 5-6 ore: la causa nascosta è php-fpm su OpenLiteSpeed
- Cos'è un Redirect 301 e perché utilizzarlo su WordPress
- Come Installare Plugin WordPress: Guida Completa
FAQ
No, le password non vengono restituite dalle risposte standard dell’API. L’endpoint degli utenti può però rivelare nomi, identificativi e informazioni pubbliche associate agli account.
Sì, ma il blocco globale può compromettere Gutenberg, plugin, applicazioni mobili e siti headless. Nella maggior parte dei casi è preferibile limitare autenticazione, endpoint o tipi di contenuto.
No. _fields riduce i campi richiesti e il traffico trasferito, ma non impedisce a un client di formulare altre richieste autorizzate.
La rotta deve usare permission_callback e verificare una capacità WordPress, come edit_posts o manage_options, in base al tipo di informazione pubblicata.
Sì, ma il blocco dell’intero percorso può rompere funzioni legittime di WordPress. È più prudente applicare regole mirate a endpoint, utenti, indirizzi IP o frequenza delle richieste.
Altri articoli di questa serie:
- Autenticazione a due fattori WordPress per admin
- Ottimizzare database WordPress: pulizia sicura
- Immagini WebP AVIF WordPress: upload e conversione
- Schermata bianca WordPress: trova il colpevole nel log
- Configurare SMTP WordPress: email fuori dallo spam
- Staging WordPress locale e online senza rischi
