问题描述

我可以看到 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;  }

那么隐藏字段中有一个值属性是什么意思?

最佳解决方案

长文慎入

简而言之,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()的第一个参数,这个动作就是一切。

Recap

要通过 wp_verify_nonce()验证,您需要将 2 个参数传递给该函数,其中一个是在 nonce 隐藏字段中的值,另一个是该操作,并且取决于如何构建随机数值。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。