Cum funcționează verificarea nonce în WordPress?

12 iul. 2015, 20:01:00
Vizualizări: 13.9K
Voturi: 15

Văd că wp_nonce_field generează o valoare în câmpul hidden.

<input type="hidden" id="message-send" name="message-send" value="cabfd9e42d" />

Dar wp_verify_nonce nu folosește acea valoare, din câte înțeleg, deși s-ar putea să greșesc.

Se pare că folosește un token de sesiune pentru verificare.

$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 );
 if ( hash_equals( $expected, $nonce ) ) 
  { return 1;  }

Atunci care este rostul atributului value în câmpul hidden?

4
Comentarii

Ai și valoarea $nonce acolo - verificarea returnează false dacă valoarea $nonce lipsește.

birgire birgire
12 iul. 2015 20:54:38

Da, am văzut asta, dar verifică doar dacă nu este gol, deci poate fi orice

ed-ta ed-ta
12 iul. 2015 23:03:38

avem și valoarea $nonce în această comparație: hash_equals( $expected, $nonce )

birgire birgire
13 iul. 2015 00:13:04

Așa este. Mă concentram pe valoare.

ed-ta ed-ta
13 iul. 2015 00:18:20
Toate răspunsurile la întrebare 1
2
16

Pe scurt

Pe scurt, wp_verify_nonce() folosește acea valoare pentru că așteaptă acea valoare ca prim argument.

wp_verify_nonce() argumente

wp_verify_nonce() primește 2 argumente:

  1. $nonce
  2. $action

Valoarea din câmpul ascuns ('cabfd9e42d' în exemplul tău) reprezintă $nonce.

Primul argument este nonce-ul și vine din cerere

De fapt, wp_verify_nonce() trebuie folosit astfel:

// aici presupun că formularul este trimis folosind metoda 'post'

$verify = wp_verify_nonce($_POST['message-send']);

Deci primul argument transmis la wp_verify_nonce() este exact valoarea care este prezentă în câmpul ascuns.

Al doilea argument: metoda wp_create_nonce()

În ceea ce privește al doilea argument, acesta depinde de cum ai construit valoarea nonce.

De exemplu, dacă ai făcut:

<?php $nonce = wp_create_nonce( 'custom-action' ); ?>
<input type="hidden" name="message-send" value="<?php echo $nonce ?>" />

Atunci trebuie să faci:

$verify = wp_verify_nonce( $_POST['message-send'], 'custom-action' );

Deci, al doilea argument este ceea ce a fost folosit ca argument pentru wp_create_nonce().

Al doilea argument: metoda wp_nonce_field()

Dacă ai creat nonce-ul folosind wp_nonce_field() astfel:

wp_nonce_field( 'another_action', 'message-send' );

Atunci trebuie să verifici nonce-ul astfel:

$verify = wp_verify_nonce( $_POST['message-send'], 'another_action' );

Deci, de data aceasta, acțiunea este orice a fost transmis ca prim argument la wp_nonce_field().

Rezumat

Pentru a trece de validarea wp_verify_nonce() trebuie să transmiți 2 argumente funcției, unul este valoarea din câmpul ascuns nonce, celălalt este acțiunea și depinde de cum a fost construită valoarea nonce.

12 iul. 2015 20:58:29
Comentarii

@birgire Fac greșeli ca un profesionist :)

gmazzap gmazzap
12 iul. 2015 21:06:22

Măcar sunt câțiva editori profesioniști de engleză pe site care ne ajută pe noi, cei care nu vorbim engleza ca limbă maternă, să ne corectăm greșelile, lol ;-). Explicație grozavă, apropo, +1

Pieter Goosen Pieter Goosen
12 iul. 2015 21:20:56