Como funciona a verificação de nonce?

14

Eu posso ver que wp_nonce_field gera um valor no campo oculto.

<input type="hidden" id="message-send" name="message-send" value="cabfd9e42d" />

Mas wp_verify_nonce não está usando esse valor, tanto quanto eu posso dizer, mas posso estar errado.

Parece que está usando um token de sessão para verificação.

$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 );
 if ( hash_equals( $expected, $nonce ) ) 
  { return 1;  }

Então, qual é o sentido de ter um atributo value no campo oculto?

ed-ta
fonte
1
Você também tem o $noncevalor - a verificação retorna false se o $noncevalor estiver ausente.
birgire
Sim, eu vi isso, mas apenas verifica se não está vazio assim que poderia ser qualquer coisa
ed-ta
também obtivemos o $noncevalor nesta comparação:hash_equals( $expected, $nonce )
birgire
Isso é verdade. Eu estava focando no valor.
ED-ta

Respostas:

15

TL; DR

Em resumo, wp_verify_nonce() usa esse valor porque espera esse valor como seu primeiro argumento.

wp_verify_nonce() argumentos

wp_verify_nonce() recebe 2 argumentos:

  1. $nonce
  2. $action

O valor no campo oculto ( 'cabfd9e42d'no seu exemplo) representa o $nonce.

O primeiro argumento é o nonce e vem da solicitação

De fato, wp_verify_nonce()deve ser usado assim:

// here I assume that the form is submitted using 'post' as method

$verify = wp_verify_nonce($_POST['message-send']);

Portanto, o primeiro argumento passado wp_verify_nonce()é exatamente o valor presente no campo oculto.

Segundo argumento: o wp_create_nonce()método

Em relação ao segundo argumento, isso depende de como você constrói o valor nonce.

Por exemplo, se você fez:

<?php $nonce = wp_create_nonce( 'custom-action' ); ?>
<input type="hidden" name="message-send" value="<?php echo $nonce ?>" />

Então você precisa fazer:

$verify = wp_verify_nonce( $_POST['message-send'], 'custom-action' );

Portanto, o segundo argumento é o que foi usado como argumento wp_create_nonce().

Segundo argumento: o wp_nonce_field()método

Se você criou o nonce usando o seguinte wp_nonce_field():

wp_nonce_field( 'another_action', 'message-send' );

Então você precisa verificar o nonce assim:

$verify = wp_verify_nonce( $_POST['message-send'], 'another_action' );

Portanto, desta vez, a ação é o que passou como primeiro argumento para wp_nonce_field().

Recapitular

Para passar na wp_verify_nonce()validação, você precisa passar 2 argumentos para a função, um é o valor no campo oculto nonce, o outro é a ação e depende de como o valor nonce foi construído.

gmazzap
fonte
4
@birgire eu erro de digitação como um profissional :)
gmazzap
2
Pelo menos, existem alguns editores profissionais de inglês no site para nos ajudar a digitar ingleses não nativos a limpar nossos erros de digitação, lol ;-). Grande explicação BTW, +1
Pieter Goosen