¿Cómo funciona la verificación nonce?

14

Puedo ver que wp_nonce_field genera un valor en el campo oculto.

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

Pero wp_verify_nonce no está usando ese valor por lo que puedo decir, pero puedo estar equivocado.

Parece que está usando un token de sesión para la verificación.

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

Entonces, ¿qué sentido tiene tener un atributo de valor en el campo oculto?

ed-ta
fuente
1
También tiene el $noncevalor allí: el cheque devuelve falso si $noncefalta el valor.
birgire
Sí, lo vi, pero solo comprueba si no está vacío, por lo que podría ser cualquier cosa
Ed-ta
también obtuvimos el $noncevalor en esta comparación:hash_equals( $expected, $nonce )
birgire
Es verdad. Me estaba centrando en el valor.
ed-ta

Respuestas:

15

TL; DR

En resumen, wp_verify_nonce() usa ese valor porque espera ese valor como su primer argumento.

wp_verify_nonce() argumentos

wp_verify_nonce() recibe 2 argumentos:

  1. $nonce
  2. $action

El valor en el campo oculto ( 'cabfd9e42d'en su ejemplo) representa el $nonce.

El primer argumento es el nonce, y proviene de la solicitud

De hecho, wp_verify_nonce()hay que usarlo así:

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

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

Entonces, el primer argumento pasado wp_verify_nonce()es exactamente el valor que está presente en el campo oculto.

2do argumento: el wp_create_nonce()método

Con respecto al segundo argumento, depende de cómo se construye el valor nonce.

Por ejemplo, si lo hiciste:

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

Entonces necesitas hacer:

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

Entonces, el segundo argumento es para lo que se utilizó como argumento wp_create_nonce().

2do argumento: el wp_nonce_field()método

Si creó el nonce usando wp_nonce_field()como:

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

Luego debe verificar el nonce de esta manera:

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

Entonces, esta vez, la acción es lo que se pasa como primer argumento wp_nonce_field().

Resumen

Para pasar la wp_verify_nonce()validación, debe pasar 2 argumentos a la función, uno es el valor en el campo oculto nonce, el otro es la acción y depende de cómo se construyó el valor nonce.

gmazzap
fuente
44
@birgire Hago un error tipográfico como un profesional :)
gmazzap
2
Al menos hay algunos editores profesionales de inglés en el sitio que nos ayudan a los tipeadores no nativos de inglés a limpiar nuestros errores tipográficos, jajaja ;-). Gran explicación por cierto, +1
Pieter Goosen