我的插件中有一个类似于此的表单:
<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插件,但它现在已被禁用,此问题仍然存在。我在我的生产网站上启用了多站点功能,但我不相信它与之相关。有什么想法吗?
答案 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是否这样做。
或者,如果您的系统配置尚未这样做,则可以选择自己重写这些功能。这将是安全代码,并要谨慎地编写安全代码:开源安全代码的最大节省之处在于它是经过同行评审的,并且您的(新)代码可能不会相同。