Как работает проверка nonce в WordPress?

12 июл. 2015 г., 20:01:00
Просмотры: 13.9K
Голосов: 15

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

4
Комментарии

У вас также есть значение $nonce - проверка возвращает false, если значение $nonce отсутствует.

birgire birgire
12 июл. 2015 г. 20:54:38

Да, я это видел, но проверяется только, что оно не пустое, поэтому там может быть что угодно

ed-ta ed-ta
12 июл. 2015 г. 23:03:38

мы также используем значение $nonce в этом сравнении: hash_equals( $expected, $nonce )

birgire birgire
13 июл. 2015 г. 00:13:04

Это верно. Я сосредоточился на значении.

ed-ta ed-ta
13 июл. 2015 г. 00:18:20
Все ответы на вопрос 1
2
16

Кратко

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

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

wp_verify_nonce() принимает 2 аргумента:

  1. $nonce
  2. $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.

12 июл. 2015 г. 20:58:29
Комментарии

@birgire Я делаю опечатки как профессионал :)

gmazzap gmazzap
12 июл. 2015 г. 21:06:22

По крайней мере, на сайте есть профессиональные англоязычные редакторы, которые помогают нам, не носителям языка, исправлять опечатки, лол ;-). Отличное объяснение, кстати, +1

Pieter Goosen Pieter Goosen
12 июл. 2015 г. 21:20:56