Está en la página 1de 4

ATAQUES XSS, COMO

PREVENIRLOS EN PHP

En la lnea anterior estamos utilizando strip_tags() para permitir slo las


etiquetas que estamos indicando en el segundo
parmetro "<b><i><p><img>" pero, que ocurrira si un atacante
incluyese el siguiente cdigo en el campo del comentario? ...

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

Estara inyectando cdigo JavaScript a travs del evento onmouseover de


JavaScript, como podemos ver el atacante podra redireccionar a cualquier
usuario a un script en su servidor para tratar, por ejemplo, de robar las
credenciales del usuario simulando la pgina de inicio de sesin 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 sera


necesario el uso de input-filter ya que ests funciones se encargarn 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";
/* Slo las etiquetas b,i,p,img y slo 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 imgenes, impidiendo la ejecucin
de cdigo JavaScript en algn mtodo JavaScript.

Htmlspecialchars
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT |
ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode =
true ]]] )

Esta funcin convierte los siguientes caracteres:


- '&' (et) se convierte en '&'
- '"' (comillas dobles) se convierte en '"' cuando ENT_NOQUOTES no est
establecido.
- "'" (comilla simple) se convierte en ''' (o ') slo cuando ENT_QUOTES est
establecido.
- '<' (menor que) se convierte en '<'
- '>' (mayor que) se convierte en '>'
Si queremos ver la tabla entera de opciones podemos ir a la documentacin
oficial. Sin embargo vamos a mostrar la forma ms adecuada de uso de la
funcin.
Ejemplo de uso:
htmlspecialchars($_POST[var], ENT_QUOTES,'UTF-8');

La bandera ENT_QUOTES indica que vamos a convertir a entidades


HTML ambos tipos de comillas. Tanto las simples como las dobles.

En cuanto al 'charset' de codificacin vamos a elegir UTF-8 (por defecto


en PHP 5.4). Ya que es contiene el conjunto de caracteres ms completo
y es el estndar para una aplicacin multi-idioma.

Existe una funcin muy similar a htmlspecialchars(). Se trata de

htmlentities(). Por lo que tambin se podra usar para evitar


ataques XSS. Sin embargo htmlentities() codifica cualquier entidad
HTML, lo que har un procesamiento extra de codificacin sobre
elementos que no son potencialmente peligrosos.
En resumen las diferencias entre ambas funciones son las siguientes:

htmlspecialchars() slo escapa 5 caracteres que son < > & y las
comillas tanto simples como dobles.

htmlentities() escapa cualquier carcter que tenga equivalente en


html, por ejemplo, vocales acentuadas.

Qu es escapar?
Escapar un carcter es ante poner una contra barra detrs de l.
$variable = "Cadena de texto \"entre comillas\"";
echo $variable;

Como vern, las comillas que corresponden a la cadena se escapean con el


carcter \ , permitiendo esto que las comillas puedan ser guardadas dentro
de la cadena, evitando que se confundan con el cierre.
Los caracteres reservados de un lenguaje deben ser escapados para que
en su compilacin no se abran las cadenas ni se mal interprete el
cdigo.

Nota sobre PHP Formulario de Seguridad


Los $ _SERVER ["PHP_SELF"] variable puede ser utilizado por los
hackers!
Si PHP_SELF se utiliza en su pgina, entonces el usuario puede
introducir una barra (/) y algo ms de Cross Site Scripting (XSS)
manda a ejecutar.
Cross-site scripting (XSS) es un tipo de vulnerabilidad de
seguridad informtica se encuentran tpicamente en las
aplicaciones Web. XSS permite a los atacantes inyectar
secuencias de comandos del lado del cliente en las pginas web
visitadas por otros usuarios.

Supongamos que tenemos el siguiente formulario en una pgina


llamada "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Ahora, si un usuario introduce la URL normales en la barra de


direcciones como "http://www.example.com/test_form.php", el cdigo
anterior se traduce a:

<form method="post" action="test_form.php">

Hasta ahora, todo bien.


Sin embargo, tenga en cuenta que un usuario entra en la siguiente
URL en la barra de direcciones:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')
%3C/script%3E

En este caso, el cdigo anterior ser traducido a:


<form method="post"
action="test_form.php/"><script>alert('hacked')</script>

Este cdigo aade una etiqueta de script y un comando de alerta. Y


cuando se carga la pgina, se ejecutar el cdigo JavaScript (el
usuario ver un cuadro de alerta). Esto es slo un ejemplo sencillo e
inofensivo cmo se puede explotar la variable PHP_SELF.
S consciente de que cualquier cdigo JavaScript se puede
agregar dentro de la etiqueta <script>! Un hacker puede
redirigir al usuario a un archivo en otro servidor, y ese archivo puede
contener cdigo malicioso que puede alterar las variables globales o
enviar el formulario a otra direccin para guardar los datos de los
usuarios, por ejemplo.

Cmo evitar $ _SERVER ["PHP_SELF"] Exploits?


$ _SERVER ["PHP_SELF"] hazaas se puede evitar mediante el uso de
la funcin htmlspecialchars().
El cdigo del formulario debera tener este aspecto:
<form method="post" action="<?php echo
htmlspecialchars($_SERVER["PHP_SELF"]);?>">

La funcin htmlspecialchars () convierte caracteres especiales a


entidades HTML. Ahora bien, si el usuario intenta explotar la variable
PHP_SELF, el resultado ser el siguiente resultado:
<form method="post"
action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/scri
pt&gt;">

El exploit intento falla, y no se hace dao!

También podría gustarte