Desinfección de datos: Mejores prácticas con ejemplos de código

13

Estoy tratando de entender el saneamiento 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 detallan las mejores prácticas. Encontré un par de recursos, incluida la página del códice titulada Validación de datos, aunque ninguno fue útil para mí. La página de Codex 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 en particular. El propósito de esta publicación es solicitar a todos que contribuyan con ejemplos de código incorrecto / no saneado y cómo se debe volver a escribir para una correcta desinfección. Este podría ser un código general para sanear el título de la publicación o la publicación src de thumnails o códigos más elaborados que manejen la desinfección de los datos de $_POST 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 que se mencionan en el bloque de código a continuación) se encargan automáticamente del trabajo de desinfección. En caso afirmativo, ¿hay alguna excepción cuando tomaría medidas adicionales para limpiar 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, ¿el saneamiento debe hacerse de manera diferente cuando se hace eco de HTML en PHP en comparación con PHP en línea de HTML? Para tener más claro 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 afirmaciones anteriores logran lo mismo. Pero, ¿necesitan ser santizados de manera diferente?

    
pregunta John 11.04.2012 - 18:06

2 respuestas

12

Esta página de códice lo explica bastante bien, creo.

La función más importante y comúnmente utilizada es probablemente esc_attr . Toma este ejemplo:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

Si $author_name contiene un carácter " , cierra su atributo, y si ese carácter va seguido de onclick="do_something();" , podría empeorar :)

Hacer print esc_attr($author_name) garantiza que dichos caracteres estén codificados y que el navegador no haga las cosas que se supone que no debe hacer.

Hay un caso en el que no lo necesita: cuando espera un número, en cuyo caso simplemente puede convertir los datos de entrada en un entero, por ejemplo:

print (int)$_POST['some_number'];

Las funciones meta * que enumeró allí ya se encargan de sanear la entrada para el almacenamiento de la base de datos, por lo que no debe preocuparse por eso.

El método wpdb->prepare() se debe utilizar cuando realice las consultas de la base de datos usted mismo. Aquí hay un ejemplo:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

Las palabras clave %s y %d serán reemplazadas por sus valores de $ _POST desinfectados.

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:

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

No hagas esto :)

  

Además, el saneamiento debe realizarse de manera diferente cuando se hace eco de HTML   en PHP como contra PHP en línea de HTML?

     

Tanto las declaraciones anteriores   lograr lo mismo. Pero, ¿necesitan ser santizados de manera diferente?

No.

    
respondido por el onetrickpony 11.04.2012 - 18:51
4

Este video de Mark Jaquith lo aclaró todo para mí. enlace

    
respondido por el byronyasgur 18.06.2012 - 22:16

Lea otras preguntas en las etiquetas