WordPress 不刷新服务器上的随机数令牌


WordPress not refreshing nonce token on the server

我的插件中有一个类似于这样的表单:

<!-- Client form -->
<form>
   <?php wp_nonce_field('my_form','_my_token'); ?>
   <!-- Additional form fields -->
</form>

它会生成这两个字段:

<input type="hidden" id="_my_token" name="_my_token" value="abcdefghij" />
<input type="hidden" name="_wp_http_referer" value="/wp-admin/tools.php?page=my-plugin%2Fplugin.php" />

当我提交此表单时,我像这样验证它:

//Server's side check
if(!wp_verify_nonce($_POST['_my_token'],'my_form')){
   echo 'Invalid token! Expected token: '. wp_create_nonce( 'my_form');
   exit;
} 

问题是在服务器上,令牌永远不会更改,它总是相同的,并且验证在此步骤中总是失败。如果我从WordPress注销,然后再次登录,则客户端令牌已更改,但在服务器上是相同的。

我已经在本地对此进行了测试,当我再次登录时,它总是在两端更改令牌,但在我的生产环境中,它只会在客户端更改。

看起来它以某种方式缓存了,但不确定到底是什么。我使用了WP超级缓存插件,但它现在被禁用了,这个问题仍然存在。我在生产站点上启用了多站点功能,但我认为这与它无关。有什么想法吗?

你期望你的随机数改变的时间框架是什么?

在没有其他更改的连续刷新中,随机数在页面加载之间可能相同。基本上,如果你坐在那里按F5,你会得到同样的随机数。

这是设计使然。需要在短时间内幂等创建随机数,以便将它们用于验证。

再一次,基本上,如果这不能以这种方式工作,您将永远无法验证您的随机数。当您创建它时,该值将是一回事,当您重新创建它以验证它时,该值将是另一回事。验证总是会失败。

wp_verify_nonce()可以接受随机数(其他条件相同)长达 24 小时(请参阅 WP Codex 页面)。您可能需要等待更长的时间才能收到不同的随机数。

可能发生的其他系统事件可能会导致生成新的随机数。我自己从来不需要这样做,但似乎您可以使用wp_nonce_tick()来慢跑这个过程。

wp_create_nonce()(由wp_nonce_field()直接使用)和wp_verify_nonce()可能已被某些插件重写,因为它们都是在pluggable.php中定义的,并且旨在用于覆盖。编写良好的 WP 感知 CDN 或其他缓存解决方案可以完全做到这一点来持久化会话。我不知道超级缓存是否这样做。

或者,如果您的系统配置尚未这样做,您可以选择自己重写这些函数。这将是安全代码,并且要小心编写安全代码:开源安全代码的最大节省是它是经过同行评审的,并且您的(新)代码不太可能相同。