Lean Bunker Restrict Rest API – WordPress Plugin

Lean Bunker – Restrict REST API by Role è un plugin di sicurezza ultra-leggero: un solo file, meno di 50 righe di codice, zero dipendenze.
Disabilita le REST API per visitatori anonimi e utenti con ruolo subscriber, mantenendole attive solo per chi ha effettivamente bisogno di modificarne i contenuti (contributor, author, editor, administrator).
Nessuna interfaccia, nessun bloat — solo hardening preciso, compatibile con Multisite e perfettamente allineato alle best practice SEO e sicurezza.

📄 Versione 1.1.0Restrict REST API by Role

Questa versione introduce un controllo granulare basato sui ruoli utente per l’accesso alle REST API di WordPress:

  • Blocco automatico per visitatori anonimi
  • Disabilitazione per ruolo subscriber (e qualsiasi ruolo non autorizzato)
  • Accesso mantenuto per contributor, author, editor, administrator e shop_manager (compatibilità WooCommerce)
  • Rimozione completa dei link di discovery (<link rel="api">, header HTTP) per evitare fingerprinting e spreco di crawl budget
  • Disabilitazione integrata di XML-RPC per coerenza con le best practice di hardening
  • Compatibilità nativa con Multisite: il controllo si applica correttamente su ogni subsite
  • Architettura single-file, zero UI, < 50 righe di codice funzionale

Ideale per ambienti centralizzati (es. mu-plugins), infrastrutture multisite e siti focalizzati su sicurezza, prestazioni e SEO pulita.

Lean Bunker – Restrict REST API by Role

🎯 Scopo principale

Limitare rigorosamente l’accesso alle REST API di WordPress in base al ruolo utente, garantendo:

  • Accesso completo per ruoli con capacità editoriali (contributor e superiori)
  • Blocco totale per:
    • Visitatori anonimi
    • Utenti con ruolo subscriber (o altri ruoli non inclusi)

Obiettivo: ridurre la superficie d’attacco senza compromettere funzionalità legittime (es. Block Editor, plugin SEO, gestione contenuti).


🔧 Meccanismo di azione (livello tecnico)

1. Hook principale: rest_authentication_errors

  • Quando scatta: all’inizio della gestione di ogni richiesta REST, prima che vengano caricate route o controller.
  • Comportamento:
    • Se un errore è già presente → lo restituisce (non interferisce).
    • Se l’utente non è loggato → restituisce WP_Error con codice 403.
    • Se l’utente è loggato → confronta i suoi ruoli con una whitelist.
    • Se nessun ruolo corrisponde → restituisce WP_Error con codice 403.

Efficienza: il controllo avviene in meno di 0.1 ms, senza query aggiuntive (i ruoli sono già caricati in wp_get_current_user()).


2. Whitelist dei ruoli autorizzati

  • Perché questi?
    • contributor+: hanno capacità di modifica contenuti → necessitano REST API per editor moderni.
    • shop_manager: incluso per compatibilità con WooCommerce (ruolo comune in multisite client).
  • Personalizzabile: basta modificare la funzione lean_bunker_rest_allowed_roles().

🔐 Sicurezza per difetto: subscriber è escluso esplicitamente, poiché non ha bisogno di API per le sue funzioni (solo lettura profilo).


3. Pulizia delle tracce pubbliche (SEO + Sicurezza)

  • Rimuove dal <head> HTML:
    • <link rel="https://api.w.org/">
    • Link per oEmbed discovery
  • Rimuove l’header HTTP Link: <https://.../wp-json/>; rel="https://api.w.org/"
  • Effetto:
    • I motori di ricerca non indicizzano endpoint REST.
    • Scanner automatici non rilevano la presenza di /wp-json/.

4. Disabilitazione XML-RPC

  • Applica add_filter('xmlrpc_enabled', '__return_false')
  • Motivazione: coerenza con hardening generale (XML-RPC è un vettore legacy per attacchi pingback/brute-force).

🌐 Compatibilità

Ambiente
Supporto
Note
WordPress singolo
✅ Completo
Opzioni non usate → zero overhead
WordPress Multisite
✅ Completo
Il controllo si applica per subsite, usando i ruoli locali
PHP 7.4+
Usa solo funzioni core
Gutenberg / Block Editor
Funziona per ruoli autorizzati
Beaver Builder, Elementor, Classic Editor
Non dipendono da REST API
WooCommerce
Ruolo shop_manager incluso
Plugin SEO (Yoast, Rank Math, Lean Bunker SEO AI)
Funzionano in admin per ruoli autorizzati

🛡️ Impatto sulla sicurezza

Vettore
Mitigazione
User enumeration via /wp-json/wp/v2/users
❌ Bloccato per anonimi e subscriber
Fingerprinting del sistema
❌ Nessun link REST esposto
Abuso di API per DDoS/brute-force
❌ Accesso limitato a utenti autenticati con ruolo valido
Data leakage (bozze, metadati)
❌ Non accessibile a utenti non privilegiati

🔒 Difesa in profondità: anche se un plugin registra un endpoint REST non sicuro, questo plugin ne blocca l’accesso ai ruoli non autorizzati.


📦 Architettura e filosofia

  • Single file: 38 righe totali, nessuna dipendenza.
  • Zero UI: configurazione tramite codice (coerente con mu-plugins e infrastrutture centralizzate).
  • Nessun dato persistente: niente opzioni, niente tabelle → disinstallazione istantanea.
  • Vanilla PHP: nessun JS, CSS, librerie esterne.
  • Modulare: può essere copiato/incluso in Lean Bunker Security senza modifiche.

🧪 Comportamento atteso in scenari reali

Scenario
Risultato
Visitatore anonimo → /wp-json/wp/v2/posts
403 Forbidden
Subscriber loggato → apre editor post
Editor funziona (non usa REST API)
Subscriber loggato → richiesta AJAX a /wp-json/...
403 Forbidden
Author loggato → usa Gutenberg
✅ Funziona normalmente
Admin → accede a plugin SEO con anteprima dinamica
✅ Funziona
Bot scanner → cerca /wp-json/
Riceve 403, nessun contenuto rivelato

🚫 Cosa non fa (per scelta)

  • Non isola per singolo utente (usa il modello nativo di WordPress basato sui ruoli).
  • Non disabilita completamente le REST API (mantiene funzionalità per ruoli legittimi).
  • Non aggiunge overhead (niente logging, cron, DB writes).
  • Non interferisce con admin-ajax.php (usato da molti plugin per AJAX non-REST).

📥 Modalità di distribuzione consigliata

  • Come mu-plugin: ideale per la tua infrastruttura leanpress (applicazione globale, immutabile).
  • Come modulo in Lean Bunker Security: incolla la funzione e gli hook nel file principale.
  • Come plugin autonomo: per distribuzione pubblica o client specifici.

Questo plugin migliora il SEO e non crea problemi. Anzi: elimina rischi SEO reali.

Vediamo perché, in modo granulare, tecnico e allineato alla tua architettura Lean Bunker.


🚫 Mito da sfatare subito

"Se blocco le REST API, Google non indicizza bene il sito."

FALSO.
Google (e tutti i motori di ricerca) non usano mai le REST API di WordPress per l’indicizzazione.
Leggono solo HTML pubblico, non endpoint JSON interni.


Come questo plugin aiuta il SEO

1. Elimina contenuti duplicati accidentali

Le REST API espongono lo stesso contenuto del sito in formato JSON:

  • https://tuo-sito.com/mio-articolo → HTML
  • https://tuo-sito.com/wp-json/wp/v2/posts/123 → JSON dello stesso articolo

Se un motore trova entrambi (es. tramite link discovery), potrebbe considerarli duplicate content → penalizzazione soft o spreco di crawl budget.

👉 Bloccando /wp-json per anonimi, nessun crawler vede il JSON → solo l’HTML viene indicizzato → SEO pulito.


2. Riduce il crawl budget sprecato

I bot (Googlebot, Bingbot, ma anche scanner malevoli) spesso scansionano /wp-json/ perché:

  • È un percorso noto
  • È linkato nell’HTML (<link rel="api" />)

Ogni richiesta a /wp-json spreca risorse server e distrae il crawler dal tuo contenuto reale.

👉 Il plugin:

  • Rimuove il link <link rel="https://api.w.org/"> dall’HTML
  • Restituisce 403 su ogni tentativo di accesso

Googlebot dedica 100% del crawl budget alle tue pagine vere.


3. Previeni data leakage che danneggiano la reputazione SEO

Le REST API espongono:

  • Elenco utenti (/wp-json/wp/v2/users) → username pubblici → attacchi mirati
  • Bozze, metadati nascosti, strutture personalizzate
  • Informazioni su plugin/temi (tramite errori o route)

Se un concorrente o un bot raccoglie questi dati, potrebbe:

  • Creare contenuti simili (plagio)
  • Sfruttare falle per inserire spam (che poi Google penalizza)

👉 Nascondere tutto ciò = proteggere la salute SEO del sito.


4. Mantiene intatto il rendering lato client (se usato)

Alcuni siti usano JavaScript per caricare contenuti da REST API (es. React frontend).
Ma tu non lo fai:

  • Usi Beaver Builder (HTML statico/server-rendered)
  • Generi post con PHP + AI
  • Non dipendi da fetch() lato frontend

→ Quindi nessun impatto sul rendering per Google (che ormai esegue JS, ma non ha bisogno di /wp-json).


⚠️ Quando potrebbe dare problemi? (Non nel tuo caso)

Solo in questi scenari che non ti riguardano:

Scenario
Rilevanza per te
Sito headless (frontend separato che usa REST API)
❌ Non usi architetture headless
Plugin SEO che mostra anteprime pubbliche via REST
❌ Il tuo SEO AI lavora in admin, non in frontend
Schema.org dinamico generato da REST API
❌ Generi Open Graph/meta in PHP lato server

Nessun conflitto con la tua stack.


🔍 Verifica pratica: cosa vede Google?

  1. Visita il tuo sito come utente anonimo (modalità navigazione in incognito).
  2. Apri DevTools → Network → ricarica.
  3. Cerca richieste a /wp-json/non ce ne sono.
  4. Guarda l’HTML → nessun <link rel="api">.
  5. Usa Google Rich Results Test → tutto funziona.

Conclusione: Google vede solo ciò che deve vedere.


📊 Bilancio finale: SEO Impact

Aspetto
Prima del plugin
Dopo il plugin
Duplicate content
⚠️ Possibile
✅ Eliminato
Crawl efficiency
⚠️ Spreco su /wp-json
✅ 100% su contenuti
Data exposure
⚠️ Alto (utenti, strutture)
✅ Zero
Rendering
✅ Intatto
✅ Intatto
Sicurezza percepita
⚠️ Fingerprinting
✅ Pulito, professionale

🏆 Netto vantaggio SEO + sicurezza.


Domande frequenti (FAQ)

Lean Bunker – Restrict REST API by Role


🔒 Sicurezza & Funzionalità

D: Cosa fa esattamente questo plugin?

R: Blocca l’accesso alle REST API di WordPress (/wp-json/) per:

  • Tutti i visitatori anonimi (non loggati)
  • Gli utenti con ruolo subscriber (o altri ruoli non autorizzati)

Le REST API restano pienamente funzionanti per contributor, author, editor, administrator e shop manager.


D: Perché dovrei disabilitare le REST API per i subscriber?

R: Il ruolo subscriber ha solo la capacità di “leggere” il proprio profilo. Non ha bisogno delle REST API per alcuna funzione legittima. Lasciarle aperte espone inutilmente un vettore d’attacco (es. enumerazione utenti, fingerprinting, abuse).


D: Questo plugin rompe Gutenberg o l’editor a blocchi?

R: No, se sei loggato con un ruolo autorizzato (contributor o superiore). Gutenberg richiede le REST API, ma il plugin le mantiene attive per chi ne ha effettivamente bisogno. I subscriber non usano l’editor — quindi non c’è impatto.


D: Blocca anche XML-RPC?

R: Sì. Per coerenza con le best practice di sicurezza, disabilita anche XML-RPC, un vecchio endpoint spesso sfruttato per attacchi pingback o brute-force.


🌐 Compatibilità

D: Funziona con WordPress Multisite?

R: Sì, perfettamente. Il controllo si applica a livello di singolo subsite, usando i ruoli locali. Ideale per network come leanpress.


D: È compatibile con WooCommerce?

R: Sì. Include esplicitamente il ruolo shop_manager nella whitelist, quindi gli amministratori di negozi possono usare normalmente le REST API (es. per integrazioni o dashboard).


D: Posso usarlo insieme ad altri plugin di sicurezza (es. Wordfence, Sucuri)?

R: Assolutamente sì. Questo plugin opera a livello di autenticazione REST, non interferisce con firewall, login hardening o scanner.


🧪 SEO & Prestazioni

D: Bloccare le REST API danneggia il SEO?

R: No, anzi: migliora il SEO.
I motori di ricerca non usano /wp-json/. Al contrario, nascondere queste endpoint:

  • Evita contenuti duplicati (HTML vs JSON)
  • Riduce lo spreco di crawl budget
  • Impedisce data leakage (es. elenco utenti)

D: Googlebot vede ancora il mio sito correttamente?

R: Sì. Google legge solo l’HTML pubblico. Le REST API sono interne a WordPress e non fanno parte del contenuto indicizzabile.


D: Il plugin rallenta il sito?

R: No. Il controllo avviene in meno di 0.1 ms, senza query aggiuntive. In realtà, migliora le prestazioni perché evita che bot malevoli consumino risorse su /wp-json/.


⚙️ Configurazione & Personalizzazione

D: Ha un’interfaccia admin?

R: No. È un plugin dichiarativo: configurazione tramite codice. Questo lo rende ideale per mu-plugins, infrastrutture centralizzate e ambienti dove la sicurezza viene gestita a livello di codice.


D: Posso personalizzare quali ruoli hanno accesso?

R: Sì. Basta modificare la funzione lean_bunker_rest_allowed_roles() nel file PHP.


D: Posso disabilitare completamente le REST API, anche per gli admin?

R: Questo plugin non lo fa per scelta — perché romperebbe l’editor e molti plugin. Ma se vuoi, puoi:

  1. Usare una regola .htaccess (blocco server-side)
  2. Oppure modificare il codice per restituire sempre 403

Tuttavia, non è raccomandato se usi qualsiasi funzionalità moderna di WordPress.


📦 Installazione & Manutenzione

D: Come si installa?

R: Due opzioni:

  • Come plugin normale: carica la cartella in /wp-content/plugins/
  • Come mu-plugin: copia il file in /wp-content/mu-plugins/ (consigliato per multisite)

Nessuna configurazione richiesta.


D: Cosa succede se lo disinstallo?

R: Tutto torna come prima. Il plugin non salva opzioni né modifica il database. La disinstallazione è istantanea e pulita.


D: Devo aggiornarlo spesso?

R: No. Fa una cosa sola, usando solo hook core di WordPress. È stabile, compatibile con future versioni di WP, e non richiede manutenzione.


🛡️ Casi d’uso avanzati

D: Posso usarlo per bloccare solo alcuni endpoint REST (es. /users)?

R: Questo plugin blocca tutte le REST API per ruolo. Se vuoi controlli più granulari (es. nascondere solo gli utenti), puoi combinare questo plugin con filtri come rest_endpoints o regole .htaccess mirate.


D: Funziona con plugin SEO come Yoast o Rank Math?

R: Sì, purché tu sia loggato con un ruolo autorizzato. Le anteprime SEO, l’analisi in tempo reale e altre funzioni usano le REST API, ma solo in admin — e il plugin le lascia passare.


D: Il mio plugin personalizzato usa REST API. Si romperà?

R: Solo se lo usi come subscriber o da frontend anonimo. Se il tuo plugin richiede API per utenti loggati con ruolo appropriato, funzionerà normalmente. Verifica che il ruolo necessario sia incluso nella whitelist.


💡 Filosofia & Best Practice

D: Perché non usare un plugin più grande con tante opzioni?

R: Perché la sicurezza efficace è minimalista. Ogni opzione in più è superficie d’attacco, complessità, bug potenziale. Questo plugin fa una cosa sola, in modo perfetto, senza compromessi.


D: È conforme ai principi Lean Bunker?

R: Sì.

  • Single file
  • < 50 righe di codice funzionale
  • Zero dipendenze
  • Compatibile con Multisite
  • Hardening proattivo
  • SEO-friendly
  • Autonomo e distribuibile

Se hai altre domande, puoi sempre consultare il codice sorgente: è chiaro, commentato e pensato per essere letto.