wp_verify_nonce vs check_admin_referer


21

Qual è la differenza, quale dovrei usare?

So che wp_verify_nonce controlla il limite di tempo e check_admin_referer penso che chiami wp_verify_nonce oltre a verificare la presenza di un segmento dell'URL di amministrazione, ma sono un po 'confuso su quale dovrei usare e quando.

Grazie per la chiarezza


1
Distintivo di Tumbleweed per questa domanda? Veramente? Chiunque?
Jeff,

Risposte:


29

Ho pensato che check_admin_referercontrollò il nonce (che fa chiamata wp_verify_nonce, e l'URL di riferimento Dopo aver scavato nel codice di base mi sono reso conto che non lo ha fatto pensando che fosse un bug ho riferito, e Ryan Boren risposto con il seguente..:

In realtà, se il nonce è valido, il referrer non deve essere verificato. L'inaffidabilità dei referrer è uno dei motivi per cui vengono utilizzate le noncci. I nonces sostituiscono completamente il referrer. L'unica volta che controlliamo il referrer è quando gestiamo la condizione di compatibilità con le versioni precedenti -1. -1 significa che qualcuno non sta usando i nonces quindi torniamo al controllo dei referrer. Questo utilizzo è ora molto raro. check_admin_referer () è chiamato male ora che non fa quasi mai il controllo dei referrer. Sarebbe meglio nominare qualcosa come check_nonce (), ma lo manteniamo come per la compatibilità con la versione precedente e per i vecchi tempi.

Quindi non c'è in realtà alcuna differenza.


Bel lavoro di scavo, grazie, che porta un po 'di chiarezza.
Jeff,

5
In realtà c'è una grande differenza che influenza l'uso ... check_admin_referer uccide l'intero script con die () se il nonce non è valido, mentre wp_verify_nonce restituisce false. Quindi, se ci sono alcune circostanze normali in cui il nonce fallirà, usa wp_verify_nonce in modo che il resto dello script venga ancora eseguito.
SeventhSteel

@SeventhSteel - hai ovviamente ragione. La mia interpretazione della domanda era che la logica del controllo dei nonci veniva confrontata piuttosto che cosa succede quando non è valida
Stephen Harris,

3

NO!!!

Non contare check_admin_referer, stai attento!

  • Include wp_verify_nonesolo nel caso in cui sia _wpnoncestato impostato !!!
  • In tal caso, non lo è DIE(). Al contrario, restituisce false ...

Dai un'occhiata a questo fseudo-codice ( la fonte completa è qui ):

function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
    .....
    $result = isset($_REQUEST[$query_arg]) ? wp_verify_nonce($_REQUEST[$query_arg], $action) : false;
    do_action( 'check_admin_referer', $action, $result );
    if ( ! $result && ! ( -1 == $action && strpos( $referer, $adminurl ) === 0 ) ) {
        die(...);
    }
    return $result;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.