web-dev-qa-db-ja.com

ナンス検証はどこのように機能しますか?

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属性を持つことの意味は何ですか?

12
ed-ta

TL、DR

つまり、wp_verify_nonce()その値を最初の引数として期待 _しているためです。

wp_verify_nonce()引数

wp_verify_nonce() は2つの引数を受け取ります。

  1. $nonce
  2. $action

隠しフィールド(この例では'cabfd9e42d')の値は$nonceを表します。

最初の引数はノンスであり、そして要求から来る

実際、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()に渡される最初の引数は、隠しフィールドに存在する値とまったく同じです。

第二引数:wp_create_nonce()メソッド

2番目の引数に関しては、それはあなたが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' );

したがって、2番目の引数は wp_create_nonce() への引数として使用されたものです。

第二引数: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つの引数を渡す必要があります。1つはnonce隠しフィールドの値、もう1つはaction、そしてnonce値がどのように構築されたかによって異なります。

12
gmazzap