Enviado por b@cHo en InfoSec, PHP
Protegiendo tus formularios contra XSS
Este dia, les escribiré acerca de como protegerse de los famosos ataques XSS, pero para protegerse de algo primero hay que saber en que consisten estos ataques:
XSS, del inglés Cross-site scripting es un tipo de inseguridad informática o agujero de seguridad basado en la explotación de vulnerabilidades del sistema de validación de HTML incrustado.
Ahora bien sigamos con el trabajo…
Imaginemos que tenemos una form que expone lo que pusiste (para que quien sabe)
Algo asi:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Ejemplo de XSS</title> </head><form action="xss.php" method="post"> <input name="texto" type="text" value="<SCRIPT SRC=vurnerable.js></SCRIPT>" /> <input type="submit" value="Enviar" name="Enviar"> </form> <body> </body> </html>
Y su PHP:
<?php
if (isset($_POST['Enviar'])) {
echo $_POST['texto'];
}
else {
}
?>
Como pueden ver ya incluí un value a la form, que lo que hace es simplemente mostrar un alert en javascript.
Ahora esto es lo que sucede si ejecutan el form:
Como pueden ver el el formulario es mas que vurnerable, ahora bien, analicemos donde viene el problema:
Si! Del PHP, porque al momento de hacer el ECHO incluye las etiquetas SCRIPT haciendo posible el XSS.
Ahora bien, les muestro 2 formas muy efectivas de evitar estos ataques.
La primera forma es usar la función HTMLENTITIES, que lo que hace es básicamente lo mismo que HTMLSPECIALCHARS, que traduce algunos símbolos como < > y & a sus equivalentes en HTML
Para esto regresamos al PHP, y añadimos una nueva variable, para pasar el _POST por htmlentities
<?php
if (isset($_POST['Enviar'])) {
$lol = htmlentities($_POST['texto']);
echo $lol;
}
else {
}
?>
Y como pueden ver, el XSS fue neutralizado:
Ahora bien, el segundo metodo consiste en usar PREG_MATCH, para crear una expresión regular para aceptar solo algunos caracteres.
Para esto editamos el PHP y añadimos una comprobacion pregmatch a la variable $_post['texto']:
<?php
if (isset($_POST['Enviar'])) {
$lol = htmlentities($_POST['texto']);
if (!preg_match("/^[a-zA-Z0-9]+$/", $lol)){
die('Solo se aceptan caracteres de la A-Z y numeros');
}
echo $lol;
}
else {
}
?>
En este caso como pueden ver, se agrego un nuevo statement para terminar la ejecucion del PHP en caso de que hubiera caracteres diferentes a letras de la A a la Z y del 0 al 9
Como pueden ver, también evitó la ejecución del XSS
Y si regresa el resultado, si son validos:
Finalmente les tengo unas dos sugerencias:
- Nunca subestimen los ataques XSS
- Usen metodo POST cuando puedan y GET cuando sea realmente necesario
Sin nada mas que agregar me despido!
No dejo ejemplo web, pero les adjunto el formulario..
Primer formulario: vurnerable.zip
Htmlentities: htmlentities.zip
Preg_Match: pregmatch.zip
Posts Relacionados
- BBCode en PHP Quien haya frecuentado foros, esta familiarizado con el BBcode, pero...
- Creando un CAPTCHA Pués debido a mi entrada anterior, me gustaria dar a...
- Upload Form en PHP En esta entrada se explicará como hacer un form (ya...


