wp_verify_nonce vs check_admin_referer - Differenze e utilizzo

5 apr 2012, 19:45:50
Visualizzazioni: 14.8K
Voti: 29

Qual è la differenza, quale dovrei usare?

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

Grazie per la chiarezza.

1
Commenti

Distintivo Tumbleweed per questa domanda? Davvero? Nessuno?

Jeff Jeff
19 apr 2012 21:53:05
Tutte le risposte alla domanda 2
3
38

Pensavo che check_admin_referer verificasse il nonce (effettivamente chiama wp_verify_nonce, e l'URL di riferimento. Dopo aver approfondito il codice del core, mi sono reso conto che non faceva questo. Pensando fosse un bug, l'ho segnalato, e Ryan Boren ha risposto con quanto segue:

In realtà, se il nonce è valido, il referrer non dovrebbe essere verificato. L'inaffidabilità dei referrer è una delle ragioni per cui si utilizzano i nonce. I nonce sostituiscono completamente la verifica del referrer. L'unico caso in cui controlliamo il referrer è quando gestiamo la condizione di compatibilità all'indietro -1. -1 significa che qualcuno non sta utilizzando i nonce, quindi torniamo alla verifica del referrer. Questo utilizzo è ormai molto raro. check_admin_referer() è mal chiamato, dato che ormai quasi mai effettua la verifica del referrer. Sarebbe meglio chiamarlo qualcosa come check_nonce(), ma lo manteniamo così per compatibilità all'indietro e per vecchia consuetudine.

Quindi, in effetti, non c'è alcuna differenza.

15 mag 2012 23:13:40
Commenti

Bel lavoro di ricerca, grazie, questo chiarisce un po' le cose.

Jeff Jeff
17 mag 2012 01:19:03

C'è in realtà una grande differenza che influisce sull'utilizzo... check_admin_referer termina l'intero script con die() se il nonce non è valido, mentre wp_verify_nonce restituisce false. Quindi se ci sono circostanze normali in cui il nonce potrebbe fallire, usa wp_verify_nonce in modo che il resto dello script venga comunque eseguito.

SeventhSteel SeventhSteel
9 mar 2015 20:41:54

@SeventhSteel - hai ovviamente ragione. La mia interpretazione della domanda era che si confrontasse la logica di verifica dei nonce piuttosto che ciò che accade quando è invalido

Stephen Harris Stephen Harris
9 mar 2015 20:58:31
0

NO! ATTENZIONE !!!

Non fare affidamento su check_admin_referer() senza i parametri corretti! Perché, in alcuni casi potrebbe non eseguire die() (contrariamente alle tue aspettative), invece restituirà semplicemente la risposta false.

Analizza il comportamento delineato dalla logica del codice sorgente:

function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
    $result   = isset( $_REQUEST[ $query_arg ] ) ? wp_verify_nonce( $_REQUEST[ $query_arg ], $action ) : false;

    //Controllo "die()"
    if ( ! $result && ( -1 !== $action || strpos( wp_get_referer(), admin_url() ) !== 0 ) ) {
        die();
    }
    return $result;
}

Quindi, devi capire cosa fa questa logica. Ecco una spiegazione:

A) Se chiami semplicemente check_admin_referrer() senza parametri:

  • RICORDA, utilizzerà il valore predefinito _wpnonce (che è sicuro, ma ricorda sempre di avere esattamente quel campo durante l'invio).
  • Avendola chiamata senza parametri, utilizza il valore predefinito -1 per l'azione, facendo sì che il controllo die() venga saltato e la funzione non eseguirà die()
  • Quindi, dovresti sempre usare (quando chiami senza parametri):

if ( check_admin_referer() ) exit;

B) Se vuoi che check_admin_referrer termini automaticamente, allora dovresti sempre creare i tuoi nonce e chiamarla con i parametri:

check_admin_referrer($nome_azione, $nome_campo );

20 mar 2017 23:01:56