Seguridad en desarrollos web: Evitar la inyección de código (parte 1)

Comment

Informática Programación Servidor (PHP) Software

La inyección de código es la técnica que suelen usar los hacerks para acceder a la base de datos de un sistema, mediante el uso de los propios formularios de la web. Es decir, escribir una sentencia sql, por ejemplo en la caja de “nombre de usuario”, de modo de poder obtener información de la base de datos y de privilegios de acceso.

Calculo que el 99,9% de los programadores, tiene que haber escuchado de este tema, pero “del dicho al hecho, hay un gran trecho”. Entonces, qué podemos hacer para evitar este tipo de problema?

Bien, desde PHP hay al menos dos técnicas que conozco que se puedan utilizar para evitar el code injection. En este artículo sólo describiré una, el filtrado de variables. En el próximo post, hablaremos de utilizar PDO cómo método de conexión y ejecuciones en la base de datos.

Entonces bien, si PHP nos proporciona las herramientas, y son realmente sencillas, por qué no aprovecharlas. Les aseguro que, al menos el filtrado de variables, no es una técnica que retrase el trabajo. Simplemente basta con conocer las funciones y las constantes que se utilizan, que las pueden encontrar en el manual de PHP.

¿De qué se tratan los filtros? De eliminar caracteres no deseados en el valor de una variable externa, recibida desde el cliente. En este artículo sólo haremos referencia a dos de las funciones más utilizadas, el resto las pueden consultar en el enlace antes mencionado.

filter_input

Toma una variable externa concreta por su nombre y opcionalmente la filtra. Como primer parámetro se debe indicar el tipo de variable externa (INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV), luego el nombre de la variable y por último el filtro a procesar.

Lo que hay que tener en claro es el filtro a aplicar, la página Tipos de filtros del manual enumera los filtros disponibles. Si se omite, se utilizará FILTER_DEFAULT, que es equivalente a FILTER_UNSAFE_RAW. Esto resultará en que no se realice ningún tipo de filtro de forma predeterminada.

Hay filtros de varios tipos, los más utilizados sirven para quitar los caracteres no deseados (filtros de saneamiento), pero también hay filtros de validación. Aunque normalmente la validación de datos se suele realizar del lado del cliente, también puede ser útil para casos como las cookies.

No entraré en detalle por cada filtro, eso lo pueden ver en el manual. Pero sí les pondré un ejemplo de cada uno al final del artículo.

filter_var

Es similar al explicado anteriormente, pero en lugar de utilizarlo con variables externas, se utiliza con variables definidas.

<?php

$emails = array(
    'Test Example <test@example.com>',
    'test@localhost',
    'test@localhost.com'
);

foreach ($emails as $email) {
    echo (filter_var($email, FILTER_VALIDATE_EMAIL)) ? 
        "[+] Email '$email' is valid\n" : 
        "[-] Email '$email' is NOT valid\n";
}
?>
El resultado será el siguiente:
 [-] Email 'Test Example <test@example.com>' is NOT valid
 [-] Email 'test@localhost' is NOT valid
 [+] Email 'test@localhost.com' is valid

Un ejemplo de uso de los filtros de saneamiento, sería el siguiente:

<?php $valor = 'a123.'; echo filter_var($valor, FILTER_SANITIZE_NUMBER_INT); ?>
El resultado será el siguiente:
 123

Deja un comentario