How to expire a nonce?

时间:2016-04-15 作者:Divyanshu Jimmy

我知道,我们可以使用30秒的过滤器来改变当前的使用寿命:

add_filter( \'nonce_life\', function () { return 30; } );
我的rest api有一个logout()函数。我希望在成功登录后使我创建的nonce过期:$nonce = wp_create_nonce( \'login\'.$user_id );

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

使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会话令牌提交它——除非黑客劫持了您的设备并在您登录时登录,否则极不可能。。。但到那时,你就有了另一种安全问题。

相关推荐

WP_CREATE_NONCE在使用WP_LIST_TABLE时不进行验证

我创建了一个管理页面,在该页面中,我使用WP\\u list\\u Table显示MySQL表的列表。在这个表中,我需要能够在需要时删除记录。这就是我的问题所在。要删除记录,我设置了以下代码。class Genres_List extends WP_List_Table { [...] public static function delete_genre( $id ) { global $wpdb; $w