Sicurezza web

Nonce

Definizione

Un nonce è un valore, in teoria casuale e monouso, aggiunto a uno scambio per impedire che venga riprodotto o falsificato. In WordPress il nonce è un token legato a un’azione, a un utente e alla sua sessione, valido da 12 a 24 ore, che protegge soprattutto dagli attacchi CSRF.

Nonce, Sicurezza web

La parola viene dall’inglese «number used once». In crittografia MDN lo definisce come un valore arbitrario usato una sola volta in una comunicazione, per impedire che un messaggio intercettato venga riprodotto, garantire che una risposta sia recente o aggiungere casualità a un calcolo. Sul web, però, il termine indica due realtà piuttosto diverse, che è meglio non confondere: il nonce crittografico «puro» e il nonce di WordPress.

Gli usi del nonce sul web

  • Nei protocolli: gli scambi di TLS e molti meccanismi di autenticazione includono valori casuali monouso, così una conversazione registrata non può essere riprodotta tale e quale.
  • In una Content Security Policy: il server genera un valore casuale a ogni risposta, lo inserisce nella direttiva script-src 'nonce-…' e nell’attributo nonce degli script autorizzati. Una CSP rigorosa esegue solo gli script che portano il valore giusto. MDN insiste: deve cambiare a ogni risposta e restare imprevedibile.
  • Contro le richieste falsificate: un token segreto aggiunto ai moduli dimostra che la richiesta proviene davvero da una pagina del sito, il che blocca gli attacchi CSRF. È il ruolo principale dei nonce di WordPress.

I nonce di WordPress: non proprio dei nonce

Lo riconosce la stessa documentazione ufficiale di WordPress: i suoi nonce non sono né numeri né monouso. La funzione wp_create_nonce() calcola un hash di dieci caratteri a partire dall’azione richiesta, dall’ID dell’utente, dal suo token di sessione e da un intervallo di tempo. Il calcolo usa le chiavi NONCE_KEY e NONCE_SALT del file wp-config.php, da qui l’importanza del loro salt univoco.

  • Durata: un giorno per impostazione predefinita, diviso in due periodi di 12 ore. A seconda del momento in cui è stato creato, un nonce resta quindi valido tra 12 e 24 ore. Il filtro nonce_life modifica questa durata.
  • Riutilizzabile: WordPress non verifica che un nonce sia stato usato una sola volta. Non protegge quindi dalla riproduzione durante il suo periodo di validità.
  • Visitatori non collegati: il loro ID vale 0, per cui tutti i visitatori anonimi possono ricevere lo stesso nonce per la stessa azione.
Schema in cinque fasi: WordPress crea un nonce legato all’azione, all’utente, alla sua sessione e a un periodo di 12 ore; l’utente invia il modulo con il token; una richiesta falsificata su un altro sito arriva senza il token giusto; check_admin_referer o wp_verify_nonce la respinge; infine current_user_can verifica la capability prima di agire
Il nonce dimostra che la richiesta viene da una pagina del sito; la verifica dei permessi è un passaggio separato.

Per WordPress: usare bene i nonce

Per chi sviluppa temi o plugin, la regola si riassume in tre funzioni e una verifica dei permessi:

// Nel modulo
wp_nonce_field( 'elimina_post_' . $post_id );

// In fase di elaborazione
check_admin_referer( 'elimina_post_' . $post_id );
if ( ! current_user_can( 'delete_post', $post_id ) ) {
    wp_die( 'Azione non autorizzata.' );
}
  • check_admin_referer() verifica il nonce e il referer nelle schermate di amministrazione, check_ajax_referer() solo il nonce per le richieste AJAX, wp_verify_nonce() negli altri casi.
  • Dai all’azione un nome preciso (con l’ID dell’oggetto) invece di un nome generico condiviso da tutto il sito.
  • Non affidarti mai al nonce per l’autorizzazione: la documentazione chiede di proteggere ogni funzione con current_user_can().

Errori frequenti

Una buona parte delle vulnerabilità dei plugin censite ogni anno deriva da un nonce assente o da una verifica di capability dimenticata, come mostra il nostro articolo sulle vulnerabilità dei plugin WordPress in cifre. Il caso tipico: un’azione AJAX verifica il nonce, ma non il permesso dell’utente. Un nonce però può trapelare nel codice di una pagina pubblica; se è l’unica barriera, un semplice abbonato può a volte attivare un’azione da amministratore, il che porta a un’escalation dei privilegi. La nostra guida a ruoli e capability di WordPress descrive la logica del privilegio minimo.

Altra trappola: una pagina messa in cache per più di 12-24 ore serve un nonce scaduto, e il modulo fallisce con il messaggio «Il link che hai seguito è scaduto». Escludi dalla cache le pagine che contengono moduli riservati agli utenti collegati.

Per approfondire

  • Articolo Le falle dei plugin WordPress in numeri

Fonti

  1. WordPress Common APIs Handbook: Nonces (link esterno, si apre in una nuova scheda)
  2. WordPress Developer Resources: wp_create_nonce() (link esterno, si apre in una nuova scheda)
  3. MDN: Nonce (glossaire) (link esterno, si apre in una nuova scheda)
  4. OWASP: Cross-Site Request Forgery Prevention Cheat Sheet (link esterno, si apre in una nuova scheda)

Tutte le definizioni

Sicurezza WordPress, senza rumore

Un’email quando conta: nuovi attacchi osservati, aggiornamenti del plugin e guide pratiche. Niente spam, disiscrizione con un clic.

Inizia gratis, passa a Pro quando sei pronto

La versione gratuita nasconde già WordPress e sposta la pagina di login. Pro aggiunge alias, autenticazione a due fattori e monitoraggio.