随机数验证如何工作?


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值-如果$nonce缺少值,则检查返回false 。
birgire

是的,我看到了,但是它只会检查它是否不为空,所以可以是任何东西
ed-ta

我们也得到了$nonce这个比较的价值:hash_equals( $expected, $nonce )
birgire

确实如此。我一直在关注价值。
ed-ta

Answers:


15

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()方法

关于第二个参数,取决于您如何构建现时值。

例如,如果您这样做:

<?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()

第二个论点: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个参数,一个参数是现时隐藏字段中的值,另一个是action,具体取决于现时值的构建方式。


4
@birgire我像专业人士一样
打错字

2
至少在网站上有一些专业的英语编辑人员可以帮助我们的非英语打字员清理打字错误,哈哈;-)。很棒的解释BTW,+ 1
Pieter Goosen 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.