Estoy tratando de comprender la desinfección de datos (no la validación de datos) para ayudarme a escribir temas seguros para WordPress. He buscado en Internet tratando de encontrar una guía completa para desarrolladores de temas que detalle las mejores prácticas. Encontré un par de recursos, incluida la página del códice titulada Validación de datos, aunque ninguno me fue útil. La página del códice enumera las funciones de desinfección disponibles, su uso y lo que hacen, pero no explica por qué usaría una sobre la otra o en qué situación usaría una función de desinfección particular. El propósito de esta publicación es solicitar a todos que contribuyan con ejemplos de código incorrecto / no desinfectado y cómo deben reescribirse para una correcta desinfección. Este podría ser un código general para desinfectar el título de la publicación o la publicación thumnails src o códigos más elaborados que manejen la desinfección de$_POST
datos para solicitudes de Ajax.
Además, me gustaría saber si las funciones de WordPress para agregar / actualizar la base de datos (por ejemplo, las mencionadas en el bloque de código a continuación) se encargan automáticamente del trabajo de desinfección por usted. En caso afirmativo, ¿hay alguna excepción cuando tomaría medidas adicionales para desinfectar los datos enviados a estas funciones de WordPress?
add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few
Además, ¿la desinfección debe hacerse de manera diferente cuando se hace eco de HTML en PHP en comparación con PHP en línea de HTML? Para ser más claro de lo que estoy preguntando, aquí está el código:
<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>
<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>
Ambas declaraciones anteriores logran lo mismo. ¿Pero necesitan ser santificados de manera diferente?
Respuestas:
Esta página del códice explica bastante bien, creo.
La función más importante y comúnmente utilizada es probablemente
esc_attr
. Toma este ejemplo:Si
$author_name
contiene un"
personaje, cierra su atributo, y si ese personaje es seguido poronclick="do_something();"
él podría empeorar :)Haciendo
print esc_attr($author_name)
garantiza que dichos caracteres estén codificados y que el navegador no haga cosas que no debe hacer.Hay un caso en el que no lo necesita: cuando espera un número, en cuyo caso puede convertir los datos de entrada a entero, por ejemplo:
Las funciones meta * que enumeró allí ya se encargan de desinfectar la entrada para el almacenamiento de la base de datos, por lo que no necesita preocuparse por eso.
El
wpdb->prepare()
método debe usarse cuando realiza las consultas de base de datos usted mismo. Aquí hay un ejemplo:Las palabras clave
%s
y%d
se reemplazarán con sus valores desinfectados de $ _POST.Un error muy común que veo en muchos complementos en el repositorio de WP.org es pasarle una consulta ya preparada (y mal preparada), como:
No hagas esto :)
No.
fuente
Este video de Mark Jaquith me lo aclaró todo. http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/
fuente