Handling expired nonces

时间:2017-12-30 作者:CHP

我有一个有几个按钮的页面。当人们单击按钮时,会发出AJAX请求并更新页面的各个部分。为了安全起见,AJAX请求使用nonce。

我注意到,如果有人打开页面的时间超过了nonce过期所需的时间,那么AJAX请求将按预期停止工作。然而,我想要一个更健壮的行为。

我想做的是-检测nonce何时过期/失败,然后在该点以某种方式生成一个新的nonce。

这是一个由两部分组成的问题:

如何检测nonce已过期

1 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

nonce并不是魔法子弹,只要在任何地方应用它,你的网站就会变得更安全。从广义上讲,nonce应该只应用于已登录的用户,而应用于未登录的用户则用处不大。即使对于已登录的用户,也可能存在不需要nonce的情况(例如在读取公共可用信息时)。

。。。。但是在编码时,在任何地方应用nonce都比重复检查用户是否登录要容易得多。尽管如此,如果一个页面可以保持打开一天以上并且仍然保留其所有功能对您来说很重要,那么这就是解决方法——删除不需要的nonce。

您描述的nonce问题是WordPress没有按照定义实现nonce的结果。nonce应该在每次页面加载时都是唯一的,而WordPress会重复使用它们24小时。这具有巨大的性能和体系结构优势,因为它消除了将它们存储在某处的要求,但会导致像您描述的那样的问题,如果不每隔24小时“强制”重新加载页面,这些问题很难消除。因此,解决问题的另一个解决方案是使用自己的逻辑重写nonce api以生成一次性nonce,或者为未登录的用户使用不同的时间间隔。

为什么不在JS中以某种方式检测过期?因为nonce是使用秘密的“SALT”密钥生成的,而重建计算的唯一方法是在JS中公开它们,此时它们将不再是秘密的。

结束

相关推荐

NONCE在nopriv调用中不生效

我有一个使用Ajax调用的函数:function bs_reserve_gift() { if (!wp_verify_nonce($_POST[\'_wpnonce\'], \'reserve_gift\')) { $response[\'status\'] = \'error\'; $response[\'message\'] = __(\'Something went wrong, please try again later!