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.