viernes, 17 de octubre de 2014

PHP (06) Validaciones (04) Evitando entrandas de código en formularios

Un problema de seguridad que nos podemos encontrar es que un usuario, como decía un profesor mio, "con mala leche", quiera introducir código html dentro de un formulario, esto puede provocar fallos en la web, y por supuesto en el tratamiento de los datos.
Por ejemplo si tomamos el script del articulo comprobando datos, podemos comprobar que si introducimos nuestro nombre de este modo: <b>nombre</b>, nuestro nombre aparecerá en negrita en la respuesta, cosa que no deseamos.
Afortunadamente PHP tiene una solución muy sencilla para esto, de hecho vamos a tomar ese mismo código y vamos a introducirle tan solo dos cambios quedando del siguiente modo:
<html>
 <head>
  <title>
  Comprobación de datos requeridos
  </title>
 </head>
 <body>
  <h1>Comprobación de datos requeridos</h1>
  <?php
  /*
  Comenzamos buscando si visto esta activo, y vamos llamando a las
  funciones correspondientes para controlar el formulario
  */
   $errors_array = array();
   if(isset($_REQUEST["visto" ])){
    comprobarDatos();
    if(count($errors_array) != 0){
     mostrarErrores();
     mostrarInicio();
    }
    else {
     respuesta();
    }
   }
   else {
    mostrarInicio();
   }
   /*
   Muestra el formulario
   */
   function mostrarInicio()
   {
    echo "<form method='post'>" ;
    echo "<p>¿Cuál es su nombre?</p>" ;
    echo "<input name='flavor' type='text'>" ;
    echo "<input type='submit' value='Enviar'>" ;
    echo "<input type='hidden' name='visto' value='already_seen'>" ;
    echo "</form>" ;
   }
   /*
   Comprueba que el campo de texto no este en blanco, de ser así introduce un mensaje
   en el array global
   */
   function comprobarDatos()
   {
    global $errors_array;
    if($_REQUEST["flavor" ] == "" ) {
     $errors_array[] = "<font color='red'>Indique su nombre</font>" ;
    }
   }
   /*
   recoge los errores del array global, lo recorre y muestra su contenido
   */
   function mostrarErrores()
   {
    global $errors_array;
    foreach ($errors_array as $err){
     echo '<p>' . $err . '</p>';
    }
   }
   /*
   Muestra la respuesta del servidor cuando todo esta correcto
   */
   function respuesta()
   {
    echo "Bienvenido a PHP: ";
    $respuesta = strip_tags($_REQUEST["flavor"]);
    echo $respuesta;

   }
   ?>
 </body>
</html>

Si observamos con atención vemos que tan solo hemos introducido en la función respuesta lo siguiente:
$respuesta = strip_tags($_REQUEST["flavor"]);
echo $respuesta;

Que lo que hace es guardar en una variable el resultado de pasar la respuesta por la función strip_tags(), la cual elimina las etiquetas que pueda tener el argumento introducido, en este caso nuestra respuesta de usuario.
Finalmente se imprime la variable y de ese modo no tenemos que preocuparnos por ese tipo de personas malintencionadas.


No hay comentarios:

Publicar un comentario