Sanitize del nonce in WordPress

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.' );
}

Sponsor

Vhosting
themeforest