使nonce过期的问题在于,在WordPress中,nonce不是术语“使用一次的数字”最纯粹意义上的nonce相反,WP nonce是一个字符串的(子字符串)散列,该字符串在生成时涉及一个时间签名,其中包括:用户ID、操作名称和php会话令牌。因此,一旦生成,它就是它的本来面目,它的“使用日期”已经确定,您不能使它过期(也不能延长它)。
编辑:
您可以查看nonce是如何内置的
wp-includes/pluggable.php
:
function wp_create_nonce($action = -1) {
$user = wp_get_current_user();
$uid = (int) $user->ID;
if ( ! $uid ) {
/** This filter is documented in wp-includes/pluggable.php */
$uid = apply_filters( \'nonce_user_logged_out\', $uid, $action );
}
$token = wp_get_session_token();
$i = wp_nonce_tick();
return substr( wp_hash( $i . \'|\' . $action . \'|\' . $uid . \'|\' . $token, \'nonce\' ), -12, 10 );
中使用了相同的标准集
wp_verify_nonce()
: nonce\\u tick(它是时间元素)、action、token和uid都按相同的顺序进行组合和散列,并与提交的nonce进行比较。因此,如果其中任何一个已更改,哈希将不匹配,nonce将被拒绝。
结束编辑仅通过提交的字符串时间是否匹配(通过php的hash_equals()
) 随操作传入nonce字符串时生成的预期值。如果nonce和action与当前用户ID和会话令牌相结合,以创建与时间哈希检查匹配的哈希子字符串,则传递。
使WP nonce成为“true”nonce所缺少的是检查它之前是否已经使用/处理过一次。
安全性假设是,这并不重要,因为即使有人掌握了nonce及其相应的操作,您仍然需要使用生成它的相同用户ID和php会话令牌提交它——除非黑客劫持了您的设备并在您登录时登录,否则极不可能。。。但到那时,你就有了另一种安全问题。