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:

Pubblicità

  • 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/posts e 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:

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:

PHP
PHP Compatibility Checker
Controlla il tuo plugin WordPress prima di aggiornare PHP Verifica la compatibilità con PHP 8.0–8.5 Scopri eventuali problemi nel codice PHP Analizza il tuo plugin WordPress online Preparati a PHP 8.5
Verifica ora →
PDF Strumenti PDF gratis Nel browser, senza upload Apri gli strumenti

🔒

Contenuto riservato

Per scaricare questo file devi prima registrarti oppure accedere con il tuo account.

XWhatsAppTelegram