¿En qué contextos los complementos son responsables de la validación / desinfección de datos?

15

Quiero asegurarme de que todos los datos de mis complementos / temas se manejen de manera segura antes de ingresar a la base de datos y antes de enviarlos al navegador. Mi problema es que hay situaciones en las que la API maneja el saneamiento por usted, como cuando guarda campos meta de publicación, y otras donde el autor del plugin / tema es totalmente responsable de hacerlo, como cuando guarda configuraciones personalizadas.

Para el alcance de esta pregunta, no me preocupa validar datos a nivel de dominio, por ejemplo, verificar que un campo de Edad en un formulario esté entre 0 y 120, o que una dirección de correo electrónico sea válida. Solo me preocupa la seguridad, por ejemplo, el escape de consultas SQL para evitar la inyección de SQL al guardar en la base de datos, o la limpieza de datos que se generan en las plantillas HTML para evitar XSS.

Para el saneamiento de la salida, sé que siempre es necesario usar funciones como esc_html() y esc_attr() cuando se hacen eco de variables en plantillas HTML. Pero, ¿qué pasa cuando se usan etiquetas de plantilla ? ¿Ya todos desinfectan la salida? Si es así, ¿para qué contexto (HTML general, atributos de etiqueta, etc.)? Algunas funciones tienen variantes para diferentes contextos (como the_title_attribute() , pero la mayoría no las tienen.

Para el saneamiento de entradas, sé que necesito usar $wpdb->prepare() al realizar consultas manuales, pero ¿qué ocurre cuando se usa la API de configuración para crear una página de configuración de complementos, o guardar campos de metadatos posteriores para un tipo de publicación personalizada?

En este momento, solo he estado revisando Core y leyendo tutoriales cada vez que uso una función para averiguar si se sanea o no, pero eso es propenso a errores y consume mucho tiempo. Espero encontrar algún tipo de lista completa de todas las situaciones posibles y si la API lo maneja o no. por ejemplo,

La API valida / sanea

  • Guardando meta de publicación con update_postmeta()
  • Guardando meta del usuario con update_user_meta()
  • Salida de un título de publicación: use la variante contextual apropiada de the_title()
  • etc

Tienes que validar / sanear manualmente

  • Guardando opciones de plugin con la API de configuración. Pase una devolución de llamada como el tercer parámetro de register_setting() .
  • Consultas directas a la base de datos: ajuste la consulta en $wpdb->prepare() .
  • Variables de salida en HTML. Utilice esc_attr() , esc_html() , etc.
  • etc

También me interesaría entender por qué la API lo proporciona en ciertas situaciones, pero no en otras. Supongo que tiene algo que ver con la naturaleza desconocida de los datos, pero me encantaría escuchar una explicación detallada.

    
pregunta Ian Dunn 06.09.2012 - 21:48

2 respuestas

15

Aquí hay dos conceptos:

  • validación: asegurarse de que los datos sean válidos , es decir, un entero es un entero, una fecha es una fecha (en el formato correcto, etc.). Esto debe hacerse justo antes de guardar los datos.
  • desinfección : hacer que la fecha sea segura para su uso en el contexto actual (por ejemplo, escapar de consultas de SQL o huir de HTML en la salida).

La validación es, casi universalmente, únicamente de usted . Usted sabe qué datos le está pidiendo a un usuario, y sabe qué datos está esperando; WordPress no. La validación se llevaría a cabo, por ejemplo, en el gancho save_post antes de guardarlo en la base de datos con update_post_meta , o se podría hacer especificando una función de devolución de llamada en la API de configuración, llamada justo antes de que WordPress guarde los datos.

La desinfección es un poco más mixta. Cuando se trata de datos que WordPress conoce de forma nativa (por ejemplo, el mosaico de una publicación), puede estar seguro de que WordPress ya ha protegido los datos. Sin embargo, 'seguro' depende del contexto; Lo que es seguro para usar en una página, no es necesariamente seguro como un atributo de elemento. Por lo tanto, WordPress tendrá diferentes funciones para diferentes contextos (por ejemplo, the_title() , the_title_rss() , the_title_attribute() ) - por lo que debe usa el correcto .

En su mayor parte, su plug-in puede tratar con meta de publicación, o tal vez datos de eventos de una tabla personalizada. WordPress no sabe qué es esta información o para qué sirve, por lo que ciertamente no sabe cómo protegerla. Esto depende de ti . Esto es especialmente importante al usar esc_url() , esc_attr() , esc_textarea() etc. para evitar que las entradas malintencionadas puedan insertar código. Como WordPress sabe que se supone que next_posts() imprime una url en la página, aplica esc_url() , pero con post meta, digamos, no sabe que almacena una url, o qué quiere hacer con ella (si imprimiendo, esc_url() , si redirecciona esc_url_raw() . Si está en dobut, errar por el lado de la precaución y el escape usted mismo , y haga esto lo más tarde posible.

Finalmente, ¿qué hay de guardar datos? ¿Necesitas hacerlo seguro entonces? Como se mencionó, do necesita asegurarse de que los datos sean válidos. Pero si usa la API de WordPress ( wp_insert_post() , update_post_meta() , etc.), no necesita sanear los datos, porque al guardar los datos, lo único que debe hacer es escapar de las sentencias de SQL, y WordPress hace esto. Si está ejecutando sentencias de SQL directas (por ejemplo, para leer / escribir datos de una tabla personalizada), debe usar el $wpdb clase para ayudarte a sanear tus consultas.

Escribí esta publicación del blog sobre la desinfección y validación de los datos lo que podría ser útil, en él hablo sobre lo que se espera de usted a este respecto.

    
respondido por el Stephen Harris 07.09.2012 - 01:06
0

No estoy seguro de que sea tan completo, pero con cualquier complemento o tema, las entradas de los usuarios deben ser desinfectadas. Las operaciones de la base de datos deben realizarse usando $ wpdb- > metodos Todos los datos de $ _GET y $ _POST deben ser limpiados.

Esta es una mejor práctica para la programación de PHP que para WordPress.

Entonces, en conclusión, si hay una función de WordPress, úsela, si no, desinfecte sus variables y entradas.

Si era demasiado vago, por favor haga una pregunta más específica.

    
respondido por el Ciprian 06.09.2012 - 23:06

Lea otras preguntas en las etiquetas