Как работает одноразовая проверка?

14

Я вижу, что wp_nonce_field генерирует значение в скрытом поле.

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

Но wp_verify_nonce не использует это значение, насколько я могу судить, но я могу ошибаться.

Похоже, что он использует токен сеанса для проверки.

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

Тогда какой смысл иметь атрибут value в скрытом поле?

изд-та
источник
1
У вас также есть $nonceзначение - проверка возвращает false, если $nonceзначение отсутствует.
Birgire
Да, я видел это, но он только проверяет, если он не пустой, так что это может быть что угодно
ed-ta
мы также получили $nonceзначение в этом сравнении:hash_equals( $expected, $nonce )
birgire
Это правда. Я сосредоточился на ценности.
ed-ta

Ответы:

15

TL; DR

Короче говоря, wp_verify_nonce() использует это значение, потому что ожидает это значение в качестве первого аргумента.

wp_verify_nonce() аргументы

wp_verify_nonce() получает 2 аргумента:

  1. $nonce
  2. $action

Значение в скрытом поле ( 'cabfd9e42d'в вашем примере) представляет $nonce.

1-й аргумент - это одноразовый номер, полученный из запроса

На самом деле, wp_verify_nonce()должны быть использованы так:

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

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

Таким образом, первый передаваемый аргумент wp_verify_nonce()- это именно то значение, которое присутствует в скрытом поле.

2-й аргумент: wp_create_nonce()метод

Что касается второго аргумента, это зависит от того, как вы строите одноразовое значение.

Например, если вы сделали:

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

Тогда вам нужно сделать:

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

Итак, второй аргумент - это то, что использовалось в качестве аргумента wp_create_nonce().

2-й аргумент: wp_nonce_field()метод

Если вы создали одноразовый номер, используя wp_nonce_field()как:

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

Затем вам нужно проверить одноразовый номер так:

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

Итак, на этот раз действие - это то, что передано в качестве первого аргумента wp_nonce_field().

резюмировать

Чтобы пройти wp_verify_nonce()валидацию, вам нужно передать 2 аргумента функции, один из которых - значение в скрытом поле nonce, другой - действие и зависит от того, как было создано значение nonce.

Gmazzap
источник
4
@birgire Я делаю опечатку как профессионал :)
gmazzap
2
По крайней мере, на сайте есть несколько профессиональных английских редакторов, которые помогут нам, не носителям английского языка, убрать наши опечатки, смеется ;-). Отличное объяснение Кстати, +1
Питер Гусен