Quiero asegurarme de que todos los datos de mis complementos / temas se manejen de forma 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 la desinfección por usted, como al guardar metacampos de publicación, y otras en las que el autor del complemento / tema es totalmente responsable de hacerlo, como al guardar configuraciones personalizadas.
Para el alcance de esta pregunta, no me preocupa la validación de datos a nivel de dominio, por ejemplo, verificar que un campo 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, escapar de las consultas SQL para evitar la inyección de SQL al guardar en la base de datos o desinfectar los datos que se envían a las plantillas HTML para evitar XSS.
Para la desinfección de salida, sé que siempre debe usar funciones como esc_html()
y esc_attr()
al hacer eco de variables en plantillas HTML. Pero, ¿qué pasa cuando se usan etiquetas de plantilla ? ¿Ya desinfectan todos los resultados? 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.
Para la desinfección de entrada, sé que necesito usarlo $wpdb->prepare()
al hacer consultas manuales, pero ¿qué pasa con el uso de la API de configuración para crear una página de configuración del complemento o al guardar metacampos de publicación para un tipo de publicación personalizado?
En este momento, he estado investigando Core y leyendo tutoriales cada vez que uso una función para averiguar si se desinfecta o no, pero 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. p.ej,
API valida / desinfecta
- Guardar meta meta con
update_postmeta()
- Guardar meta del usuario con
update_user_meta()
- Salida del título de una publicación: use la variante contextualmente apropiada de
the_title()
- etc.
Tienes que validar / desinfectar manualmente
- Guardar opciones de complementos 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: envuelva la consulta
$wpdb->prepare()
. - Salida de variables en HTML. Uso
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.
the_title()
, the_permalink()
etc.) está bien, pero con datos personalizados no lo está (por ejemplo get_post_meta()
). En caso de duda, desinféctese , no puede doler.