我想更深入地解释一下how do WordPress NONCEs really work. 此外,接受的答案需要更新为更准确的信息,因为现在WordPress在创建nonce时也会考虑会话令牌。这个链接是我写的一篇很长的文章,有更深入的解释。
首先,公认的答案没有说明if
作品
让我们来解剖它,好吗?请注意,我使用的是该语句的当前版本,因为现在它还考虑了用户的会话令牌
$expected = substr( wp_hash( $i . \'|\' . $action . \'|\' . $uid . \'|\' . $token, \'nonce\' ), -12, 10 );
PHP函数
substr()
将返回字符串的一部分。
在这里,评估wp_hash()
是字符串substr()
将评估并返回的一部分。这个-12
参数表示要计数12 characters from the end 字符串的结果wp_hash()
\'s评估),substr
从结尾开始,因为减号告诉它这样做。
最后,最后一个论点10
, 表示返回10个字符作为子字符串。
因此,从末尾开始计算12个字符,然后返回10个字符,因此从返回的结果中去掉最后2个字符。
如果您检查WordPress NONCE,它正好包含10个字符。
我想澄清的另一点是WP NONCE的寿命。
我们不应该说nonce在24小时内有效,因为实际上它是alway less. 临时有效期最长为24小时,最短为12小时。更确切地说,它对2个刻度有效。
史蒂芬·哈里斯(StephenHarris)解释道,滴答声是当前NONCE寿命的增量。
默认情况下,刻度表示从UTC时间算起的12小时。因此,在午夜+1秒和中午+1秒时,刻度的值会增加1
单元
鉴于$token
保持不变(用户没有注销并重新登录),然后wp_hash()
将始终为给定的操作和用户id返回相同的哈希。
这将保持为真,直到当前刻度值增加1。在这种情况下,对于相同的操作、相同的用户id和相同的令牌,哈希将不同。
这就是WordPress认为创建的nonce有效的方式0-12 hours ago.
WordPress还认为创建的nonce有效12-24 hours ago 通过将nonce与使用前一个tick值的哈希函数进行比较。但正如我已经提到的那样,这是一种误导。12-24小时前的时段并不是指给定NONCE的实际显式创建时间(换句话说,它是not using 这个timestamp 但更确切地说,是在12-24小时的时间段内,因为它是被创造出来的。它实际上是指唯一的刻度值(比当前值小1)
如果我们用滴答声而不是小时来考虑临时有效性,那么就不会那么令人困惑了。
因此,描述有效性的最佳方式是
0-12小时==当前刻度值==t12-24小时==当前刻度值-1==以前的刻度值==t-1我希望我能让事情变得更清楚