0-12小时前生成的随机数

时间:2013-06-20 作者:laggingreflex

WordPress中有一个nonce生成/验证机制,我很难理解它为什么不能正常工作。。。

它会检查nonce是否在0-12小时前生成。

wp-includes\\pluggable.php:1260

function wp_verify_nonce($nonce, $action = -1) {
    $user = wp_get_current_user();
    $uid = (int) $user->ID;
    if ( ! $uid )
        $uid = apply_filters( \'nonce_user_logged_out\', $uid, $action );

    $i = wp_nonce_tick();

    // Nonce generated 0-12 hours ago 
    if ( substr(wp_hash($i . $action . $uid, \'nonce\'), -12, 10) == $nonce )
        return 1;
    // Nonce generated 12-24 hours ago
    if ( substr(wp_hash(($i - 1) . $action . $uid, \'nonce\'), -12, 10) == $nonce )
        return 2;
    // Invalid nonce

    return false;
}
这是怎么回事if 工作

// Nonce generated 0-12 hours ago 
if ( substr(wp_hash($i . $action . $uid, \'nonce\'), -12, 10) == $nonce )
我看到了wp_hash($i . $action . $uid, \'nonce\')=8ae70558afac4a6951e3bc0f9ef1f59a
$nonce=3551. 情况如何$nonce 正在比较-12,10第部分8ae70558afac4a6951e3bc0f9ef1f59a 应该是“0-12小时前”的支票?

2 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

WordPress nonce不是您通常使用的(“仅使用一次”)nonce。对于给定的$action, 每12小时生成一个新的nonce,一个nonce有效期为24小时,因此在任何给定点,都有两个nonce对给定的$action.

nonce是

  • $action - 行动$uid - 用户ID$i - 增量管理器
增量每12小时增加1,因此如果给定用户和操作的当前nonce是

wp_hash($i . $action . $uid, \'nonce\')
那么前一个nonce(对于相同的用户和操作)是

wp_hash(($i - 1) . $action . $uid, \'nonce\')
由于两者都是有效的nonce,当您检查收到的$nonce 你检查两者是否匹配。

SO网友:bynicolas

我想更深入地解释一下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我希望我能让事情变得更清楚

结束

相关推荐

当插件在Pluggable.php之前加载时,如何在插件中调用wp_get_Current_User()?

当前的结果是“PHP致命错误:调用未定义的函数wp\\u get\\u current\\u user()”,这很有意义,但没有帮助。我需要使用$current\\u user。以下是我当前使用的代码:$wp->init(); do_action( \'init\' ); // Check site status $file=\'http://xxxxxxxx.com/wp-admin/wp_includes/pluggable.php\'; if ( is_multi