¿Cómo usar nonce con un formulario de envío en el frontend?

27 ago 2012, 21:05:10
Vistas: 32.3K
Votos: 10

Gracias a una variedad de publicaciones aquí, he logrado armar un formulario de envío para el frontend. Después de aproximadamente 24 horas de ajustes, finalmente logré que todo funcione, incluyendo una redirección a una página de 'éxito' después del envío, pero no tengo idea de qué hacer con el nonce.

Aquí está la página del formulario: http://pastebin.com/YWyXL3jY

Y aquí está la página de éxito: http://pastebin.com/3Usu0Pt6

Ambas son plantillas de página personalizadas (sé que el formato está un poco desorganizado en este momento ya que diferentes partes vinieron de diferentes fuentes, y no creo que vaya a usar la función de carga de archivos ya que prefiero usar un plugin para mejor seguridad).

¿El nonce necesita ser procesado antes de que el usuario sea redirigido a la página de éxito? No tengo experiencia en absoluto con nonces y soy un programador PHP de 'copiar y pegar', ¡así que por favor sean amables!

¡Muchísimas gracias por cualquier consejo que puedan dar! :)

1
Comentarios

¿Está bien hacer bump a mis preguntas? He intentado añadir el verify_nonce directamente debajo del if( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] )) { - no pareció hacer nada

Jo_pinkish Jo_pinkish
29 ago 2012 14:06:50
Todas las respuestas a la pregunta 4
0
11

Utiliza el siguiente código justo antes de la etiqueta de cierre en tu código front-end.

wp_nonce_field('nombre_de_tu_accion', 'nombre_de_tu_campo_nonce');

El código anterior generará dos campos ocultos dentro de tu etiqueta de formulario. Ahora puedes verificar tu nonce en el backend donde procesarás tu formulario. Usa el siguiente código para verificar el nonce que acabas de crear arriba.

if(wp_verify_nonce($_REQUEST['nombre_de_tu_campo_nonce'], 'nombre_de_tu_accion')){

            // El nonce coincide y es válido. Haz lo que necesites ahora.

     } else {

           // Nonce inválido. Puedes mostrar un error aquí.
}

Una nota importante: observa con cuidado cómo "nombre_de_tu_accion" es el primer argumento de la función 'wp_nonce_field()' y es el segundo argumento de la función 'wp_verify_nonce()'. :) Así que no lo uses como primer argumento en ambas funciones. Mucha gente comete este error, por eso quise mencionarlo.

22 dic 2016 16:03:33
0
10

Para añadir un nonce a un formulario puedes usar la siguiente función:

wp_nonce_field($action, $name, $referer, $echo)

  • $action = (opcional) es una cadena que representa el nombre de la acción
  • $name = (opcional) es una cadena que representa el nombre del nonce. Si dejas este campo en blanco, WordPress usará por defecto "_wpnonce"

Ejemplo:

Frontend:

<form action="" method="post">
<?php wp_nonce_field('my_delete_action'); ?>
<input type="hidden" name="id" value=" <?php echo $id; ?> " />
<input type="text" name="rec_name" value=" <?php echo $name; ?> " />
<input type="submit" value="Eliminar" />
</form>

Backend:

$retrieved_nonce = $_REQUEST['_wpnonce'];
if (!wp_verify_nonce($retrieved_nonce, 'delete_my_action' ) ) die( 'Falló la verificación de seguridad' );

Fuente: https://www.tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357

1 mar 2018 04:12:53
1
-1

Utiliza esto para el nonce y verificación.

wp_nonce_field('test_action', 'submit_post');

Esto generará el campo nonce y puedes verificarlo con el siguiente código.

 if(wp_verify_nonce($_REQUEST['test_action'], 'submit_post')){
           /// realiza tu trabajo
  }else{
         /// lanza un error
  }
17 jun 2013 13:33:56
Comentarios

Esto no funcionaría como señala @Kamal Ahmed, "name_of_your_action" es el primer argumento de la función 'wp_nonce_field()' y es el segundo argumento de la función 'wp_verify_nonce()'"

Bysander Bysander
17 may 2018 18:42:24
0
-2

Comenzando con esta página: http://codex.wordpress.org/WordPress_Nonces

Luego, revisando el uso de wp_verify_nonce y el ejemplo de uso de wp_nonce_field, debes verificar el resultado de la verificación y decidir qué hacer (normalmente terminar la ejecución con die, pero en tu caso probablemente mostrar un mensaje de fallo con echo). Probablemente podrías usar la verificación como tu "comprobación de si el formulario fue enviado" en la línea 8:

if ( empty($_POST) || wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action') === false ) {
    /* fallo */
} else {
    /* éxito, procesamiento, redirección */
}

Asumiendo que la respuesta es exitosa, entonces realizarías tu siguiente acción - como mostrar un mensaje de confirmación o, en tu caso, redirigir la página. Solo asegúrate de hacer la redirección antes de que se imprima cualquier salida.

Algo para considerar también - http://kovshenin.com/2012/nonces-on-the-front-end-is-a-bad-idea/ - aunque en este caso, dado que estás creando contenido, creo que el autor menciona que es "correcto" usar nonces.

17 jun 2013 06:21:58