viernes, 21 de marzo de 2014

Prevenir ataques XSS con input-filter php


Vídeo explicativo ...



Bienvenid@s, hoy vamos a ver como usar una clase PHP que nos permitirá evitar ataques XSS, esta clase se llama input-filter y la podéis descargar en el siguiente enlace: descargar.

¿Por qué utilizar input-filter y cuando?

Por ejemplo, tenemos un sistema de comentarios en el cual sólo queremos permitir determinadas etiquetas HTML, supongamos que las etiquetas: b,i,p,img y además queremos permitir tan sólo el atributo src para img, pues con input-filter lo vamos a poder lograr, en este caso la función strip_tags() de PHP se convierte en vulnerable, ¿por qué?, veamos un ejemplo:

<?php
$comentario = strip_tags($_POST["comentario"], "<b><i><p><img>");
...

En la línea anterior estamos utilizando strip_tags() para permitir sólo las etiquetas que estamos indicando en el segundo parámetro "<b><i><p><img>" pero, ¿que ocurriría si un atacante incluyese el siguiente código en el campo del comentario? ...

<b onmouseover="window.location=\'http://atacante.com/te-robo.php\'">Haz click sobre mi para ver una mujer hermosa</b>

Estaría inyectando código javascript a través del evento onmouseover de Javascript, como podemos ver el atacante podría redireccionar a cualquier usuario a un script en su servidor para tratar, por ejemplo, de robar las credenciales del usuario simulando la pagina de inicio de sesión de la web atacada.

Así que strip_tags() no es seguro para permitir determinadas etiquetas html, de lo contrario si no quieres permitir ninguna etiqueta html opcional, puedes utilizar htmlspecialchars() o htmlentities() en este caso no te sería necesario el uso de input-filter ya que estás funciones se encargarán de convertir los caracteres especiales a sus respectivas entidades HTML.

En el caso de que queramos incluir determinadas etiquetas HTML utilizaremos input-filter del siguiente modo ...

<?php 
require "input-filter/class.inputfilter.php";
/* Sólo las etiquetas b,i,p,img y sólo el atributo src para la imagen */
$filter = new InputFilter(array('b', 'i', 'b', 'img'), array('src'));
 /*Filtrar el campo comentario*/
$comentario = $filter->process($_POST["comentario"]);
...

Con este filtro ya estamos evitando que cualquier atacante pueda hacer uso de otro atributo que no sea src para las imagenes, impidiendo la ejecución de código javascript en algún método javascript.


No hay comentarios: