Disabilitare le REST API su WordPress se non necessarie
da Massimo Della Rovere · pubblicato il 4 Febbraio, 2017 · modificato il 5 Giugno, 2017

È diverso tempo che WordPress sta lavorando sodo sull’integrazione delle REST API direttamente nel core standard. Le funzionalità sono sicuramente interessanti e molti sviluppatori specialmente in ambiente mobile ne saranno beneficiati. Infatti una volta che saranno completate del tutto sarà possibile ottenere le informazioni di WordPress tramite delle chiamate HTTPS a degli endpoint predefiniti che genereranno un file di ritorno in formato JSON con tutte le informazioni richieste. Questo eviterà di conoscere il database e rendere la nostra applicazione astratta e indipendente dal core.

Attivazione automatica

Detto questo però non mi trovo molto d’accordo sul fatto che questa opzione venga attivata automaticamente su tutti i siti web che si aggiornano alle ultime versioni di WordPress, infatti non solo la maggior parte di questi non ne ha bisogno ma in qualche modo questi siti vengono esposti a delle nuove vulnerabilità gratuitamente a causa di moduli che sono in continuo sviluppo e che ancora non hanno una lunga esperienza. Il primo esempio è proprio la versione 4.7.1 che deve essere aggiornata di urgenza in quanto è possibile cambiare il contenuto dei nostri post senza autenticazione.

Disabilitare le REST API

Se fate parte di quel gruppo di persone che usano WordPress per un classico sito HTTP e non hanno intenzione di sviluppare applicazioni che necessitano di questa tecnologia io consiglio di disattivare la funzione e non prendersi rischi inutili che possono essere in qualche modo collegati ai prossimi rilasci. In poche parole sta succedendo un po’ quello che è già successo in passato con le XMLRPC.

Per disabilitare le REST API di WordPress basta che inserite questo codice nel vostro file (function.php), il codice è valido solo per le versioni maggiori di 4.7 per le altre versioni vi lascio un’altro codice nel proseguimento dell’articolo.

add_filter('rest_authentication_errors','disable_rest_access');

// Funzione per disabilitare le REST API ed
// evitare problemi sulla sicurezza di WordPress

function disable_rest_access($access) {
    if( ! is_user_logged_in() ) {
       return new WP_Error(
          'rest_cannot_access','The REST API for WordPress is disabled.',
          array('status' => rest_authorization_required_code())
       );
    }
    return $access;
}

Se volete disattivare le REST API completamente e non permetterle neanche agli utenti collegati, operazione che ho fatto su diversi siti che proprio non ne hanno bisogno, basta eliminare il controllo is_user_logged_in() e semplificare il tutto in questo modo:

add_filter('rest_authentication_errors','disable_rest_access');

// Funzione per disabilitare le REST API ed
// evitare problemi sulla sicurezza di WordPress

function disable_rest_access($access) {
    return new WP_Error(
        'rest_cannot_access','The REST API for WordPress is disabled.',
         array('status' => rest_authorization_required_code())
    );
}

Una volta eseguita la modifica controllate subito il funzionamento del codice facendo una richiesta HTTP/HTTPS al vostro endpoint => https://dominio/wp-json/, dovreste vedere il codice di errore che abbiamo inserito nel codice precedente.

Disabilitare le REST API con un plugin

Se proprio non volete mettere mani al codice potete raggiungere lo stesso obiettivo con due plugin, uno specifico per questa funzione e l’altro per la gestione della sicurezza generale in WordPress. Vi lascio qui di seguito i link specifici:

Ovviamente se vi serve solo questa funzione vi consiglio il primo plugin, mentre se avete già installato iTheme Security o volete rafforzare il vostro WordPress in modo più completo vi consiglio il secondo plugin in cui trovate l’opzione delle REST API.

Codice per versioni precedenti alla 4.7

Come detto in precedenza, il codice che è stato presentato è valido solo per le versione di WordPress dalla 4.7 in avanti, se avete una versione precedente usate questo codice da inserire sempre nel vostro file function.php presente nel tema corrente.

function disable_json_api () 
{
    // Disable REST API v1
    add_filter('json_enabled','__return_false');
    add_filter('json_jsonp_enabled','__return_false');

    // Disable REST API v2
    add_filter('rest_enabled','__return_false');
    add_filter('rest_jsonp_enabled','__return_false');
}

add_action('after_setup_theme','disable_json_api');

Conclusione

Vorrei chiudere questo articolo dandovi un consiglio che mi sta a cuore. WordPress è una soluzione software che permette di ottenere velocemente degli ottimi risultati, peró non fate in modo che questa facilità vi faccia sottovalutare i problemi di sicurezza che si posso incontrare. La sicurezza deve sempre essere gestita e non è una cosa a carico di WordPress ma è sempre a carico nostro. Se volete migliorare questo aspetto sul vostro sito incominciate a disattivare tutte le funzioni che non utilizzate e leggete questo articolo:

3 Commenti

  1. Per la maggior parte dei siti tradizionali queste API non servono, sicuramente per applicazioni android e/o IOS saranno molto utili, peró avrei preferito che fossero disattive di default e attivate dal programmatore solo quando necessarie.

  2. Io appartengo a quel gruppo di persone che al momento non utilizzano queste API, grazie dell'articolo e vado subito in disattivazione. Visto che il codice deve tenere conto delle diverse release io opto per il plugin specifico, sono sicuro che serviranno altri aggiornamenti e tramite il plugin magari ricevo gli aggiornamenti in automatico.

  3. Ciao Roberto, io in verità evito sempre i plugin molto specifici, perché ti portano con il tempo ad avere un elenco infinito di plugin installati. Però la tua riflessione è giusta e anche se preferisco il codice la riconosco come un buon consiglio, eviterebbe l'ennesimo cambiamento API.

condividi