Previniendo ataques XSS con PHP
XSS (Cross Site Scripting) es una de las vulnerabilidades web más comunes, se produce habitualmente cuando no se validan correctamente los datos ingresados por el usuario que posteriormente son mostrados en una página, permitiendo la inyección de código “no deseado” (Javascript o VBScript). No vamos a entrar en más detalles sobre esta vulnerabilidad ni en sus variantes. Nos centraremos en como prevenirla, en este caso desde PHP:
Una función muy útil en estos casos es strip_tags
Si quisiéramos por ejemplo que los usuarios de nuestra web dejen sus comentarios en un articulo por medio de un formulario, deberíamos aplicar esta función a los datos ingresados para poder mostrarlos en nuestra web. Este sería un ejemplo:
<?php
$texto=strip_tags($texto);
?>
Cabe destacar que la función strip_tags elimina también el código HTML por lo que no permitirá dar ningún tipo de formato a los datos ingresados. Si quisiéramos darle la posibilidad al usuario de utilizar alguna etiqueta, la función cuenta con un argumento mediante el cual se especifica la o las etiquetas permitidas:
<?php
$texto=strip_tags($texto, ‘<b>’);
?>
Pero hay que tener mucho cuidado con esto (Como lo advierte uno de los warnings de la página oficial de PHP) porque esta función no elimina el código incluido dentro de los atributos de las etiquetas permitidas, por lo que si el usuario introduce algo como esto:
<b onmouseover=”<script>alert(’XSS’)</script>”>Texto en Negrita</b>
El resultado, luego de que los datos pasen por la función y sean incluidos en una página web, sería el ya clásico:
Por lo que para solucionar esto, deberiamos aplicar la función preg_replace. El script quedaría de la siguiente forma:
<?php
$texto=strip_tags($texto, ‘<b>’);
$texto=preg_replace(’/<(.*)\s+ (\w+=.*?)>’, ”, $texto);
?>
Con esto solucionariamos el “pequeño” bug de la función strip_tags.
Otra opción (muy utilizada en scripts de foros) es la de permitir un pseudocodigo (por ejemplo BBCode) que luego es reemplazado por las etiquetas HTML verdaderas:
Si el usuario ingresara lo siguiente:
[b]Negrita[/b]
Reemplazariamos el BBCode por HTML para mostrarlo en pantalla (utilizando la función str_replace) y el resultado podríamos incluirlo en una página sin correr ningún riesgo:
<?php
$texto=strip_tags($texto);
$texto=str_replace(’[b]’,’<b>’);
$texto=str_replace(’[/b]’,’</b>’);
?>
Existen varios tipos de ataques que explotan la vulnerabilidad XSS, por lo que recominedo investigarla mucho mas a fondo.
Este guía es desarrollada por leo, administrador de codigo200.com