wp_verify_nonce vs check_admin_referer - Differenze e utilizzo
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.
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.

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.

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 ilcontrollo 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 );
