我的插件中有一个类似于此的表单:
<!-- 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 Super Cache 插件,但它现在被禁用并且这个问题仍然存在。我在生产站点上启用了多站点功能,但我认为这与它无关。有任何想法吗?