Diferența dintre wp_verify_nonce și check_admin_referer în WordPress

5 apr. 2012, 19:45:50
Vizualizări: 14.8K
Voturi: 29

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.

1
Comentarii

Insignă Tumbleweed pentru această întrebare? Serios? Cineva?

Jeff Jeff
19 apr. 2012 21:53:05
Toate răspunsurile la întrebare 2
3
38

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ță.

15 mai 2012 23:13:40
Comentarii

Bună treaba de investigație, mulțumesc, asta aduce o oarecare claritate.

Jeff Jeff
17 mai 2012 01:19:03

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.

SeventhSteel SeventhSteel
9 mar. 2015 20:41:54

@SeventhSteel - ai dreptate, desigur. Interpretarea mea a întrebării a fost că logica de verificare a nonce-urilor era comparată, nu ce se întâmplă când este invalid.

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

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 ca verificarea die() să fie sărită și funcția nu va apela die()
  • 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 );

20 mar. 2017 23:01:56