WordPress不刷新服务器上的nonce令牌

时间:2016-03-16 10:56:57

标签: php wordpress wordpress-plugin custom-wordpress-pages

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

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

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

Error:-  <a href="#" class="name" style="color:blue">#: GetName #</a>

Fix:- <a href="Javascript:void(0)" class="name" style="color:blue">#: GetName #</a>

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

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

它似乎以某种方式缓存,但不确定究竟是什么。我已经使用了WP Super Cache插件,但它现在已被禁用,此问题仍然存在。我在我的生产网站上启用了多站点功能,但我不相信它与之相关。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您期望随机数在什么时间范围内变化?

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

这是设计使然。为了在使用nonce进行验证时,需要在短时间内创建幂等。

再一次,基本上,如果这种方式不能正常工作,您将永远无法验证您的现时。当您创建它时,该值将是一回事,而当您重新创建它以验证该值将是另一回事时。验证将始终失败。

wp_verify_nonce() 可以最多接受24小时的随机数(其他均相等)(请参阅the WP Codex page)。您可能需要比等待更长的时间才能收到其他随机数。

可能发生的其他系统事件可能导致生成新的随机数。我从来不需要自己做这个,但是看来您可以使用wp_nonce_tick()来进行此过程。

wp_create_nonce()(由wp_nonce_field()直接使用)和wp_verify_nonce()中的一个或两个可能已被某个插件重写,因为它们都在{{1}中定义},并打算覆盖它。一个写得很好的WP-waren CDN或其他缓存解决方案可以做到这一点,以持久化会话。我不知道Super Cache是​​否这样做。

或者,如果您的系统配置尚未这样做,则可以选择自己重写这些功能。这将是安全代码,并要谨慎地编写安全代码:开源安全代码的最大节省之处在于它是经过同行评审的,并且您的(新)代码可能不会相同。