Como expirar um nonce?

4

Estou ciente do fato de que podemos alterar o tempo de vida nonce usando o filtro, 30 segundos aqui:

add_filter( 'nonce_life', function () { return 30; } );

Eu tenho uma função logout () para minha API de descanso. Desejo expirar um nonce que eu criei após o login bem-sucedido: $nonce = wp_create_nonce( 'login'.$user_id );

    
por Divyanshu Jimmy 15.04.2016 / 20:54

1 resposta

4

O problema com a expiração de um nonce é que no WordPress, não há novidades no sentido mais puro do termo: "número usado uma vez". Em vez disso, um nonce WP é uma (substring de um) hash de uma string envolvendo uma assinatura de tempo no momento em que foi gerada, entre outras coisas: user ID, o nome da ação e seu token de sessão php. Como tal, uma vez gerada, é o que é, a data de "uso" é ativada e você não pode expirar (e não pode estendê-la).

Editar:

Você pode ver como o nonce é criado em 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 );

O mesmo conjunto de critérios é usado em wp_verify_nonce() : nonce_tick (que é o elemento de tempo), action, token e uid são todos combinados e divididos na mesma ordem e comparados ao nonce enviado. Então, se algum deles tiver mudado, os hashes não serão iguais e o nonce será rejeitado.

End Edit

O WP o valida apenas se uma string submetida corresponde ao tempo (via hash_equals() do php) de um valor esperado que é gerado quando você passa a string nonce junto com a ação. Se o nonce e a ação combinarem com seu ID de usuário e token de sessão atuais para criar uma substring de hash que corresponda à verificação de hash de tempo, você passará.

O que está faltando para fazer um WP nonce um "verdadeiro" nonce é um cheque para ver se ele já foi usado / processado uma vez antes.

A suposição de segurança é que isso não importa, porque mesmo que alguém consiga o nonce e sua ação correspondente, você ainda precisará enviá-lo usando o mesmo token de ID de usuário e sessão do php sob o qual foi gerado - - altamente improvável a menos que um hacker tenha seqüestrado seu dispositivo e esteja logado como você ... mas então você tem um tipo diferente de problema de segurança.

    
por Caspar 18.04.2016 / 22:21

Tags