Il nonce in WordPress è un hash, una stringa di caratteri e numeri casuali che viene usata per migliorare la sicurezza delle richieste che vengono fatte nel tuo sito WP.
Ecco un esempio: _wpnonce=b192fc4204.
Un nonce viene generato per ogni azione che fa un utente e ha una durata limitata.
Quando viene fatta una azione sul tuo sito da parte dell’utente, viene controllato e verificato il nonce.
Se il nonce è valido, allora quella determinata azione può continuare, altrimenti viene interrotta e WordPress ritornerà una risposta 403 Forbidden al browser.
Viene quindi verificato che l’azione sia richiesta effettivamente da quell’utente.
Poi bisogna comunque controllare i permessi dell’utente con current_user_can() per essere certi che possa compiere quella azione.
Verificare il nonce
Per verificare che il nonce sia corretto, si possono utilizzare:
check_admin_referer(): per verificare il nonce passato tramite url o tramite form allo screen admin.check_ajax_referer(): per verificare il nonce passato tramite chiamata ajax.wp_verify_nonce(): per verificare il nonce in tutti gli altri contesti.
Nello sviluppo dei plugin uso spesso il wp_verify_nonce. Nella pagina del codex viene mostrato un codice di esempio del tipo:
wp_verify_nonce( $_POST['my_nonce'], 'process-comment'.$comment_id );
Sanitizzare il nonce
C’è un piccolo problema nel codice di sopra, bisogna ricordarsi di sanitizzare la variabile $_POST['my_nonce'].
Per farlo dobbiamo prima usare wp_unslash() per essere certi di rimuovere l’eventuale slash finael.
Poi dobbiamo usare sanitize_text_field() per sanitizzare la stringa contenuta nella variabile.
Quindi il codice di esempio diventa:
$nonce = isset( $_POST['my_nonce'] )
? sanitize_text_field( wp_unslash( $_POST['my_nonce'] ) )
: '';
wp_verify_nonce( $nonce, 'process-comment'.$comment_id );
o ancora meglio, si gestisce l’eventuale esito negativo della verifica:
$nonce = isset( $_POST['my_nonce'] )
? sanitize_text_field( wp_unslash( $_POST['my_nonce'] ) )
: '';
if ( ! wp_verify_nonce( $nonce, 'process-comment' . $comment_id ) ) {
wp_die( 'Nonce non valido.' );
}


