jueves, 29 de marzo de 2012

Seguridad PHP con htmlspecialchars


Bienvenid@s, hoy vamos a ver una función muy útil para prevenir la posible introducción de código malicioso a través de campos de formularios o lo que es lo mismo, ataques XSS. La función se llama htmlspecialchars y esta función tiene de especial que transforma ciertos símbolos que son interpretados como parte del lenguaje a su entidad HTML correspondiente, es decir, ... 


  • '&' (et) se convierte en '&'
  • '"' (comillas dobles) se convierte en '"' cuando ENT_NOQUOTES no está establecido.
  • "'" (comilla simple) se convierte en ''' (o ') sólo cuando ENT_QUOTES está establecido.
  • '<' (menor que) se convierte en '&lt;'
  • '>' (mayor que) se convierte en '&gt;'

Para verlo más claro, el siguiente ejemplo contiene dos formularios en uno se filtrarán los datos a través de htmlspecialchars, en el otro no se le aplicará ningún filtro, con las correspondientes consecuencias de seguridad que puede provocar ... 



Código de ejemplo ...

<?php
/* By http://php-estudios.blogspot.com */

$resultado = "";

//Resultado con htmlspecialchars
if (isset($_POST["con"])) {
$resultado = "<p>Con htmlspecialchar: ".htmlspecialchars($_POST["con"])."</p>";
}

//Resultado sin htmlspecialchars
if (isset($_POST["sin"])) {
$resultado = "<p>Sin htmlspecialchar: ".$_POST["sin"]."</p>";
}

?>

<!DOCTYPE HTML>
<html>
<head>
<title>Seguridad PHP con htmlspecialchars</title>
</head>
<body>

<!--Formulario para la comprobación con htmlspecialchars-->
<form method="post" name="conspecialchars" action="<?php $_SERVER['PHP_SELF']; ?>">
Con htmlspecialchars...<input type="text" name="con" size="40" value="<script>alert('XSS');</script>">
<input type="submit" value="Enviar">
</form>

<hr>

<!--Formulario para la comprobación sin htmlspecialchars-->
<form method="post" name="sinspecialchars" action="<?php $_SERVER['PHP_SELF']; ?>">
Sin htmlspecialchars...<input type="text" name="sin" size="40" value="<script>alert('XSS');</script>">
<input type="submit" value="Enviar">
</form>

<!--Caja dónde se mostrará el resultado del envío de formularios-->
<div> <?php echo $resultado; ?></div>

</body>
</html>




No hay comentarios: