Diferența dintre wp_verify_nonce și check_admin_referer în WordPress
Care este diferența și pe care ar trebui să o folosesc?
Știu că wp_verify_nonce verifică limita de timp, iar check_admin_referer cred că apelează wp_verify_nonce și verifică și un segment de URL pentru administrare, dar sunt puțin confuz cu privire la care ar trebui să folosesc și când.
Mulțumesc pentru clarificare.

Eu credeam că funcția check_admin_referer
verifică nonce-ul (aceasta apelează wp_verify_nonce
, și URL-ul referrer. După ce am analizat codul de bază, am realizat că nu face acest lucru. Considerând că este o eroare, am raportat-o, iar Ryan Boren a răspuns cu următoarele:
De fapt, dacă nonce-ul este valid, referrer-ul nu ar trebui verificat. Nefiabilitatea referrer-ilor este unul dintre motivele pentru care sunt utilizate nonce-uri. Nonce-urile înlocuiesc complet verificarea referrer-ului. Singura dată când verificăm referrer-ul este atunci când tratăm condiția de compatibilitate inversă -1. -1 înseamnă că cineva nu utilizează nonce-uri, așa că revenim la verificarea referrer-ului. Această utilizare este acum foarte rară. Denumirea funcției check_admin_referer() este acum nepotrivită, deoarece aproape niciodată nu verifică referrer-ul. Ar fi mai bine denumită ceva de genul check_nonce(), dar o păstrăm așa din motive de compatibilitate inversă și pentru vechile vremuri.
Deci, de fapt, nu există nicio diferență.

Există de fapt o mare diferență care afectează utilizarea... check_admin_referer oprește întregul script cu die() dacă nonce-ul nu este valid, în timp ce wp_verify_nonce returnează false. Deci, dacă există anumite circumstanțe normale în care nonce-ul poate eșua, folosește wp_verify_nonce astfel încât restul scriptului să se execute în continuare.

NU! ATENȚIE !!!
Nu te baza pe check_admin_referer()
fără parametri corecți! Pentru că, în unele cazuri poate să nu apeleze die()
(contrar așteptărilor tale), ci va returna doar răspunsul false
.
Uită-te la comportamentul descris al logicii din codul sursă:
function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
$result = isset( $_REQUEST[ $query_arg ] ) ? wp_verify_nonce( $_REQUEST[ $query_arg ], $action ) : false;
//Acum, "verificarea die()"
if ( ! $result && ( -1 !== $action || strpos( wp_get_referer(), admin_url() ) !== 0 ) ) {
die();
}
return $result;
}
Așadar, trebuie să înțelegi ce face logica. Iată o defalcare:
A) dacă apelezi doar check_admin_referrer()
fără parametri:
- ȚINE MINTE, va folosi valoarea implicită
_wpnonce
(care este sigură, dar totuși asigură-te că ai exact acel câmp la trimitere). - Deoarece ai apelat-o fără parametri, folosește valoarea implicită
-1
pentru acțiune, ceea ce face caverificarea die()
să fie sărită și funcția nu va apeladie()
- Prin urmare, ar trebui să folosești întotdeauna (când apelezi fără parametri):
if ( check_admin_referer() ) exit;
B) dacă vrei ca check_admin_referrer
să apeleze die automat, atunci ar trebui să creezi întotdeauna nonce-urile tale și să o apelezi cu parametri:
check_admin_referrer($action_name, $name_field );
