Como funciona a verificação nonce?

12

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 o 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 objetivo de ter um atributo de valor no campo oculto?

    
por ed-ta 12.07.2015 / 19:01

1 resposta

12

TL; DR

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

wp_verify_nonce() arguments

wp_verify_nonce() recebe dois argumentos:

  1. $nonce
  2. $action

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

O primeiro argumento é o nonce e vem do pedido

Na verdade, wp_verify_nonce() tem que 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 para wp_verify_nonce() é exatamente o valor que está presente no campo oculto.

2º argumento: o método wp_create_nonce()

Em relação ao segundo argumento, 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' );

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

2º argumento: o método wp_nonce_field()

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

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

Então você precisa verificar o nonce assim:

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

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

Recapitular

Para passar a validação de wp_verify_nonce() , 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 de nonce foi construído.

    
por gmazzap 12.07.2015 / 19:58