Як працює перевірка без розгляду?


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;  }

Тоді який сенс мати атрибут значення у прихованому полі?


1
Ви також отримали $nonceзначення - чек повертає помилковим, якщо $nonceзначення відсутнє.
birgire

Так, я це бачив, але він перевіряє, чи він не порожній, щоб це могло бути щось
ed-ta

ми також отримали $nonceзначення в цьому порівнянні:hash_equals( $expected, $nonce )
birgire

Це правда. Я зосереджувався на цінності.
Ред. Та

Відповіді:


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()метод

Щодо другого аргументу, це залежить від того, як ви будуєте значення 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' );

Тоді вам потрібно перевірити так, як це було:

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

Отож, цього разу ця дія все-таки передається як перший аргумент wp_nonce_field().

Резюме

Для проходження wp_verify_nonce()перевірки вам потрібно передати 2 аргументи функції, один - це значення у не прихованому полі, інший - дія , і залежить від того, як було побудовано значення nonce.


4
@birgire Я набираю текст, як профі :)
gmazzap

2
Принаймні, на сайті є деякі про англійські редактори, які допомагають нам не рідними англійськими машинописними очистити наші помилки, lol ;-). Відмінне пояснення BTW, +1
Пітер Гусен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.