¿Necesito un campo nonce para cada cuadro de meta que agrego a mi administrador de tipo de publicación personalizado?

16

Actualmente estoy trabajando en la página de administración de mi tipo de publicación personalizada, y me quedé estancado al decidir si agregar un campo nonce nuevamente para el segundo metabox o no. Soy muy nuevo en los tipos de publicaciones personalizadas, y buscar en línea sobre esto realmente no produce tantos resultados.

¿Alguna idea? Gracias.

Ana Ban
fuente

Respuestas:

13

Lo recomendaría así.

Usted tiene (y debe) tener su propio nombre para verificar el origen de los datos y la intención del usuario. Si solo tiene un nonce para un metabox, entonces se encuentra con problemas si ese metabox se elimina (no es lo mismo que oculto). Si se elimina, el segundo metabox (o al menos debería) nunca se guardará ya que el nonce ya se envía.

Por supuesto, desde un punto de vista de seguridad, un segundo nonce no agrega nada, a menos que alguna vez desee actualizar solo un metabox y no el otro: nonces debe ser exclusivo de la acción .


Editar

Como se señaló, solo hay un formulario para la pantalla de edición posterior. Entonces, en teoría, solo necesita un campo nonce con el que validar la acción y el origen de los datos. Sin embargo, dado que los metaboxes se pueden eliminar, al tener un campo nonce en un solo metabox, no hay garantía de que el nonce esté allí. Al colocar un campo nonce en cada metabox, puede verificar si los datos de esa metabox han sido enviados (y en realidad provienen de donde cree que están) antes de procesar los datos. P.ej:

save_post_call_back($post_id){

  //Check this is not an auto-save route

  if(nonce of metabox1 present and valid){
     //Process data from metabox1
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

  if(nonce of metabox2 present and valid){
     //Process data from metabox2
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

}

El nombre del campo nonce debe ser exclusivo del metabox (y no entrar en conflicto con ningún otro nonces que esté presente en el formulario desde otros complementos).

El valor nonce debe ser exclusivo de la acción (y esto generalmente debe incluir el origen de los datos (por ejemplo, editar-publicar en lugar de editar rápidamente)). Por lo general, también incluyo el ID de la publicación.

Stephen Harris
fuente
hmm pero solo hay una <form>etiqueta en la página de administración. ¿Debería el campo nonce ser exclusivo del formulario o no? tia, @Stephen
Ana Ban
Sí, por lo que el nombre nonce debe ser exclusivo del metabox para que pueda verificarlo en cada metabox. El valor nonce debe ser exclusivo de la acción realizada y el origen de los datos (p. Ej., Dado que 'edición rápida' y la pantalla de edición normal activan la save_postacción).
Stephen Harris el
respuesta actualizada para aclarar con suerte lo que estoy diciendo :)
Stephen Harris
La cuestión es 1) ya que solo hay una etiqueta de formulario para toda la pantalla de edición y 2) automáticamente se agrega un nonce . ¿Por qué tendrías que agregar más? Siempre tendrá el nonce pase lo que pase ... Lo señalé en mi respuesta y me votaron negativamente, gracias gente ... Desde mi punto de vista, la intención es editar la página por contenido o metadatos, por ejemplo. un campo nonce ... Además, cuando intenté agregar más, ¡ni siquiera funciona con múltiples meta-cajas!
OZZIE
1
Mira mi respuesta. save_postse puede llamar desde varios contextos, por lo que no se garantiza un nonce. También es una forma conveniente de verificar que su devolución de llamada realmente tenga que hacer algo. Al agregar varios nonces, use nombres únicos. Funciona
Stephen Harris el
5

También puede enganchar el cuadro de envío que nunca desaparece agregando el campo nonce

add_action( 'post_submitbox_start', 'theme_submitdiv_extra' );
function theme_submitdiv_extra()
{
  wp_nonce_field( 'theme_meta_box_nonce', 'meta_box_nonce' );
}

Luego, en su acción save_post:

if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'theme_meta_box_nonce' ) ) return;
chilljul
fuente
1

El campo nonce se usa para validar que el contenido del formulario proviene de la ubicación en el sitio actual y no de otro lugar.

códice: wp_nonce_field

solo se requiere un campo nonce por formulario , use más de uno ya que no tiene sentido para mí.

tal vez pueda investigar y usar check_admin_referer () para asegurarse de que su solicitud sea de una página de administración

Tribalpixel
fuente
-1

En WP 3.5.2 ¡Toda la página de edición está envuelta en una etiqueta de formulario, por lo que NO debe agregar sus propias etiquetas de formulario! ¡Si aún así hace eso e intenta agregar otro meta cuadro personalizado, fallará al guardar y solo lo llevará a wp-admin home cuando intente guardar!

Además, NO agregue el campo NONCE ya que se supone que solo debe haber uno por formulario (¡esto también puede hacer que falle!) ¡Y la edición de la página ya tiene un campo nonce!

Editar:

La cuestión es 1) ya que solo hay una etiqueta de formulario para toda la pantalla de edición, como lo ha admitido el autor de la respuesta correcta, y 2) automáticamente se agrega un nonce . ¿Por qué tendrías que agregar más? Siempre tendrá el nonce pase lo que pase ...

En mi opinión, la intención es editar la página por contenido o metadatos, por ejemplo. un campo nonce ... Además, cuando intenté agregar más, ¡ni siquiera funciona con múltiples meta-cajas ! ¡Uno funcionará y el otro fallará y solo redirigirá al usuario a wp-admin home!

OZZIE
fuente
Has publicado la misma respuesta en dos preguntas, ¿fue accidental? ¿Cuál de los dos quisiste responder?
Rarst
Lo siento accidental, este. Si utiliza el componente de vista firebug o chrome de un cuadro de meta agregado con una etiqueta de formulario en wp 3.6, se elimina automáticamente y se envuelve en todo el formulario para la publicación. Entonces, ¿cómo está esto mal? ¿Por qué agregaría varios campos nonce entonces?
OZZIE
pruébalo y verás
OZZIE