Как работает проверка nonce в WordPress?
Я вижу, что 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 в скрытом поле?

Кратко
Короче говоря, wp_verify_nonce()
использует это значение, потому что ожидает его в качестве первого аргумента.
Аргументы wp_verify_nonce()
wp_verify_nonce()
принимает 2 аргумента:
$nonce
$action
Значение в скрытом поле ('cabfd9e42d'
в вашем примере) представляет собой $nonce
.
1-й аргумент — nonce, который приходит из запроса
Фактически, wp_verify_nonce()
должна использоваться следующим образом:
// здесь предполагается, что форма отправляется методом 'post'
$verify = wp_verify_nonce($_POST['message-send']);
Таким образом, первый аргумент, передаваемый в wp_verify_nonce()
, — это именно то значение, которое находится в скрытом поле.
2-й аргумент: метод wp_create_nonce()
Что касается второго аргумента, он зависит от того, как вы создали значение 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()
Если вы создали nonce с помощью wp_nonce_field()
, например:
wp_nonce_field( 'another_action', 'message-send' );
Тогда вам нужно проверить nonce следующим образом:
$verify = wp_verify_nonce( $_POST['message-send'], 'another_action' );
В этом случае действие — это то, что было передано первым аргументом в wp_nonce_field()
.
Итог
Для успешной проверки wp_verify_nonce()
вам нужно передать функции 2 аргумента: один — это значение из скрытого поля nonce, другой — действие, которое зависит от того, как было создано значение nonce.
