Una ataque XSS (Cross Site Scripting) consiste en que el atacante ingresa código HTML o javascript en los formularios y si estos no esta filtrados correctamente mostrarán este código en nuestra página alterando el contenido original. Por ejemplo en un formulario de contacto un usuario podría colocar el siguiente código:
<script>window.location = "http://www.google.com";</script>
Si nuestro formulario no valida correctamente estos datos ingresados, entonces al momento de mostrar este comentario en nuestra web automáticamente se hará un redirección a la ruta que defina el atacante. Basado en esto podríamos proponer un regla básica para cualquier desarrollo:
Toda información ingresada por el usuario siempre debe ser verificada y limpiada antes de utilizarla
Prevenir XSS con PHP (Básico)
Lo primero para prevenir estos ataques es limpiar cualquier etiqueta html ingresada por el usuario, para ello podemos utilizar la función strip_tags, la cual elimina etiquetas html. Si aplicamos esta función al texto ingresado en el ejemplo anterior tendríamos:
echo strip_tags('<script>window.location = "http://www.google.com";</script>');
// resultado: window.location = "http://www.google.com";
Esto es una forma básica de prevenir un ataque XSS, pero existen versiones mas elaboradas de códigos de ataque que pueden no ser limpiadas por esta función. Otro problema de esta solución es que limpia todas las etiquetas html, pero en algunas ocasiones existe la necesidad de permitir algunas etiquetas (Por ejemplo: p, strong, em) para lo cual necesitamos una solución mas elaborada.
Prevenir XSS con PHP Input Filter
PHP Input Filter, es una clase escrita en PHP que permite filtrar código malicioso ingresado en los formularios para prevenir ataques XSS de manera sencilla, tiene la cualidad de no limpiar determinadas etiquetas o atributos.
Para utilizar esta clase, descargamos los archivos desde el web oficial e incluimos el archivoclass.inputfilter.php al inicio de nuestro PHP. Luego se debe crear una instancia de la clase InputFilter, entonces podemos filtrar los datos con el método process de la siguiente forma:
require_once("class.inputfilter.php");
$ifilter = new InputFilter();
$nombre = $ifilter->process($_POST['nombre']);
También se pueden filtrar todos los campos enviados por el formulario, por ejemplo si el formulario es enviado por el método POST, podríamos utilizar el siguiente código para filtrar todos los campos para luego utilizarlos sin problemas.
require_once("class.inputfilter.php");
$ifilter = new InputFilter();
$_POST = $ifilter->process($_POST);
Permitir etiquetas con PHP Input Filter
Para evitar que algunas etiquetas sean filtradas podemos pasarlas como un array como parámetro al momento de crear la instancia de la clase. Por ejemplo para permitir las etiquetas strong yem y tendríamos:
require_once("class.inputfilter.php");
$ifilter = new InputFilter(array('em', 'strong'));
$_POST = $ifilter->process($_POST);
Permitir atributos con PHP Input Filter
También existe la posibilidad de desear que algunos atributos sean permitidos en el ingreso de los datos por parte del usuario. Por ejemplo podríamos permitir que los visitantes puedan ingresar enlaces para lo cual tendríamos que permitir el atributo href que contiene la ruta de destino.






enero 18th, 2012
Gsus Delicious! 
Posted in
Tags: 

