Validación y saneamiento de datos en WordPress

El saneamiento de datos consiste en un conjunto de filtros que aplicamos a los datos para hacerlos seguros en un contexto específico. Por ejemplo, si aceptamos tags html en un campo de texto debemos asegurarnos que un uso “incorrecto” de los tags no afectará al resto de la página. Estas medidas de seguridad o filtros pueden variar enormemente de un caso a otro.

La validación de datos consiste en simplemente comprobar que los datos introducidos son los que se pedían. Por ejemplo, si pedimos un email este deberá tener la estructura típica del email.

Por qué son importantes estos pasos?

Cuando escribimos código, no podemos fiarnos de nadie. Debemos considerar todos los datos no válidos si no superan unas pruebas. Cualquier dato que pueda ser manipulado por un tercero debería ser validado y saneado antes de ser procesado. De lo contrario podemos encontrarnos con agentes malintencionados que afecten sobre nuestro site de múltiples maneras.

Por ejemplo, en un input tipo texto si no hacemos ninguna comprobación, un usuario puede introducir caracteres como “>” o “<” que pueden provocar un fallo en el formulario. O incluso introducir código malicioso.

Funciones para validar y sanear

esc_html(): La función codifica caracteres especiales en entidades html, haciendo segura la visualización.

esc_attr(): parecida a la anterior pero la usaremos para datos que usemos dentro de de un elemento html, para hacer el echo es recomendable usar esc_attr_e().

esc_textarea(): la usaremos para el contenido de los textarea.

<textarea name="example"><?php echo esc_textarea( $example); ?></textarea>

esc_url(): la usaremos para validar y sanear urls. Esta función codifica caracteres especiales en entidades html y elimina carácteres inválidos y peligrosos.

esc_js(): la usaremos para textos de javascript, asegura los caracteres especiales y arregla los finales de linia.

intval(): nos devuelve cierto si el valor introducido es un integer, devuelve cero en caso contrario.

absint(): nos devuelve cierto en caso que el valor introducido sea un integer positivo, cero en caso contrario.

sanitize_text_field(): Esta función saneará un valor de entrada y quitará carácteres inválidos. Convierte caracteres especiales en entidades html, quita tags html, saltos de linia, tabs y devuelve un string limpio y seguro para ser guardado en la base de datos.

sanitize_title(): Esta función quitara cualquier tag html o php y sustituirá los espacios por el carácter “_”.  Wordpress usa esta función para generar las urls de los posts de forma segura usando los títulos de estos.

sanitize_html_class(): con esta función nos aseguramos que una clase html no tenga caracteres inválidos

sanitize_file_name(): con esta función nos aseguraremos que en caso de generar un archivo no le demos un nombre con carácteres inválidos, además reemplaza los espacios en blanco.

sanitize_email(): la usaremos para asegurarnos que una dirección de email no contiene carácteres erroneos.

is_email(): devuelve cierto si el valor introducido es una dirección de email válida.

Como curiosidad, disponemos de la función antispambot() , la qual codifica partes aleatorias de la dirección de email en entidades html cada vez que se aplica (en cada página en la que printemos la dirección con este método codificará partes distintas) dificultando el trabajo de los bots que rastreen tu página en busca de emails.

<?php
echo antispambot( 'email@domain.com' );
?>

wp_kses(): Esta función verifica que los tags html de un texto pertenecen al conjunto que nosotros decidamos, y elimina los demas.

$allowed_html=array(
    'a' => array(
        'href' => array(),
        'title' => array()
    ),
    'br' => array(),
    'em' => array(),
    'strong' => array(),
);
$filteredHtml= wp_kses($html, $allowed_html);

En este ejemplo, aceptamos los atributos href y title del tag a, junto con los tags br,em y strong. El resto de tags serán eliminados.
Por otro lado en esta función también podemos limitar los protocolos (por defecto http, https, ftp, mailto, news, irc, gopher, nntp, feed, y telnet)

wp_kses_post(): es muy parecida a wp_kses() pero no es necesario introducir los tags permitidos, ya que esta función utiliza los tags permitidos por el standard de WordPress para el contenido de posts.

Saneamiento para la base de datos

Cuando usamos funciones tales como get_posts o classes del tipo WP_Query, WordPress se encarga del saneamiento al hacer querys sobre la base de datos. Sin embargo, cuando accedemos directamente a la base de datos el saneamiento depende exclusivamente de nosotros, aunque WordPress nos aporta un classe muy útil en la forma de la classe $wpdb para ayudarnos.

Vamos a considerar el siguiente código:

$firstname = "Calimero'; DROP TABLE Example;";
$sql = "SELECT * FROM Example WHERE firstname = '$firstname';";
$results = $wpdb->query($sql);

Se ejecutara como:

SELECT * FROM Example WHERE firstname = 'Calimero'; DROP TABLE Example;';

Borrando toda nuestra tabla Example.

Para evitar este tipo de acciones, podemos usar $wpdb->prepare(). Que acepta dos parámetros:
– El comando SQL como string, donde los parametros son sustituidos por placeholders (%s para strings, %d para decimales y %f para floats)
– un array de los valores a sustituir

$firstname = "Calimero'; DROP TABLE Example;";
$results = $wpdb->prepare('SELECT * WHERE firstname = %s;',array($firstname));

Eliminando así el problema

Insertando y actualizando datos

Para insertar y actualizar datos, WordPress nos aporta las funciones $wpdb->insert() y $wpdb->update(), con un funcionamiento similar al $wpdb->prepare que veíamos antes, encargandose del saneamiento y validación de los datos.

$wpdb-> insert() acepta 3 argumentos:
– nombre de la tabla
– array de valores
– array de formatos (‘%s’,’%d’ o ‘%f’)

$wpdb->update acepta 5 argumentos:
– nombre de la tabla
– array de datos
– array de condiciones
– array de formatos de los datos
– array de formatos de las condiciones

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *