¿Cómo funciona la verificación de nonce en WordPress?

12 jul 2015, 20:01:00
Vistas: 13.9K
Votos: 15

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 según lo que puedo ver, aunque podría 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, ¿cuál es el propósito de tener un atributo value en el campo oculto?

4
Comentarios

Tienes también el valor $nonce - la verificación devuelve falso si falta el valor $nonce.

birgire birgire
12 jul 2015 20:54:38

Sí, lo vi, pero solo verifica que no esté vacío, por lo que podría ser cualquier cosa

ed-ta ed-ta
12 jul 2015 23:03:38

también tenemos el valor $nonce en esta comparación: hash_equals( $expected, $nonce )

birgire birgire
13 jul 2015 00:13:04

Es cierto. Me estaba enfocando en el valor.

ed-ta ed-ta
13 jul 2015 00:18:20
Todas las respuestas a la pregunta 1
2
16

En resumen

En pocas palabras, wp_verify_nonce() utiliza ese valor porque espera ese valor como su primer argumento.

Argumentos de wp_verify_nonce()

wp_verify_nonce() recibe 2 argumentos:

  1. $nonce
  2. $action

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

El primer argumento es el nonce y proviene de la solicitud

De hecho, wp_verify_nonce() debe usarse así:

// aquí asumo que el formulario se envía usando 'post' como método

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

Así que el primer argumento pasado a wp_verify_nonce() es exactamente el valor que está presente en el campo oculto.

Segundo argumento: el método wp_create_nonce()

En cuanto al segundo argumento, depende de cómo construyas el valor del nonce.

Por ejemplo, si 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' );

Por lo tanto, el segundo argumento es lo que se usó como argumento para wp_create_nonce().

Segundo argumento: el método wp_nonce_field()

Si creaste el nonce usando wp_nonce_field() así:

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

Entonces necesitas verificar el nonce así:

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

Esta vez, la acción es lo que se pasó como primer argumento a wp_nonce_field().

Recapitulación

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

12 jul 2015 20:58:29
Comentarios

@birgire Hago errores tipográficos como un profesional :)

gmazzap gmazzap
12 jul 2015 21:06:22

Al menos hay algunos editores profesionales de inglés en el sitio para ayudarnos a los que no somos nativos a limpiar nuestros errores tipográficos, jajaja ;-). Gran explicación por cierto, +1

Pieter Goosen Pieter Goosen
12 jul 2015 21:20:56