ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-11 11:30:28  阅读:148  来源: 互联网

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


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

<!-- 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插件,但它现在已被禁用,此问题仍然存在.我在我的生产网站上启用了多站点功能,但我不相信这与它有关.有任何想法吗?

解决方法:

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

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

这是设计的.为了使用它们进行验证,需要在短时间内无意义地创建随机数.

再一次,基本上,如果这不起作用,你永远无法验证你的随机数.当你创建它时,值将是一回事,当你重新创建它以验证它时,值将是另一个.验证总是会失败.

wp_verify_nonce()可以接受一个nonce(其他所有相等)最多24小时(见the WP Codex page).您可能需要等待更长的时间才能收到不同的随机数.

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

wp_create_nonce()(由wp_nonce_field()直接使用)和wp_verify_nonce()中的任何一个都可能已被某个插件重写,因为它们都在pluggable.php中定义并且可用于覆盖.一个写得很好的WP-aware CDN或其他缓存解决方案可以完全实现持久化会话.我不知道Super Cache是​​否这样做.

或者,如果您的系统配置尚未执行此操作,您可以选择自己重写这些功能.这将是安全代码并且要小心编写安全代码:开源安全代码最大的优势在于它是经过同行评审的,而您的(新)代码可能不一样.

标签:wordpress,php,wordpress-plugin,custom-wordpress-pages
来源: https://codeday.me/bug/20190711/1431571.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有