Jak działa weryfikacja nonce?

14

Widzę, że wp_nonce_field generuje wartość w ukrytym polu.

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

Ale wp_verify_nonce nie używa tej wartości, o ile wiem, ale mogę się mylić.

Wygląda na to, że używa tokena sesji do weryfikacji.

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

Po co więc mieć atrybut wartości w ukrytym polu?

ed-ta
źródło
1
$nonceTam też masz wartość - czek zwraca wartość false, jeśli $noncebrakuje wartości.
birgire,
Tak, widziałem to, ale sprawdza tylko, czy nie jest puste, aby mogło być czymkolwiek
ed-ta
otrzymaliśmy również $noncewartość w tym porównaniu:hash_equals( $expected, $nonce )
birgire,
To prawda. Skupiłem się na wartości.
ed-ta

Odpowiedzi:

15

TL; DR

Krótko mówiąc, wp_verify_nonce() używa tej wartości, ponieważ oczekuje jej jako pierwszego argumentu.

wp_verify_nonce() argumenty

wp_verify_nonce() otrzymuje 2 argumenty:

  1. $nonce
  2. $action

Wartość w ukrytym polu ( 'cabfd9e42d'w twoim przykładzie) reprezentuje $nonce.

Pierwszy argument jest nonce i pochodzi z żądania

W rzeczywistości wp_verify_nonce()muszą być używane w ten sposób:

// here I assume that the form is submitted using 'post' as method

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

Tak więc pierwszym przekazywanym argumentem wp_verify_nonce()jest dokładnie wartość obecna w ukrytym polu.

Drugi argument: wp_create_nonce()metoda

Jeśli chodzi o drugi argument, zależy to od sposobu budowania wartości nonce.

Np. Jeśli zrobiłeś:

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

Następnie musisz zrobić:

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

Tak więc drugi argument jest tym, co zostało użyte jako argument wp_create_nonce().

Drugi argument: wp_nonce_field()metoda

Jeśli utworzyłeś nonce używając wp_nonce_field():

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

Następnie musisz zweryfikować nonce:

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

Tym razem akcja jest tym, co przekazano jako pierwszy argument wp_nonce_field().

Podsumować

Aby przekazać wp_verify_nonce()sprawdzanie poprawności, musisz przekazać 2 argumenty do funkcji, jeden to wartość w ukrytym polu nonce, drugi to akcja i zależy od tego, jak zbudowano wartość nonce.

gmazzap
źródło
4
@ birgire Robię literówkę jak zawodowiec :)
gmazzap
2
Przynajmniej na stronie jest kilka profesjonalnych angielskich redaktorów, którzy pomagają nam w pisaniu po angielsku przez rodzimych maszynistów, lol ;-) Świetne wyjaśnienie BTW, +1
Pieter Goosen