entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

validar o sanitizar en php

cual es el proceso correcto antes de grabar en la bd los datos que vienen de un formulario.

primero se valida y luego se sanitiza o viceversa? y porque?

2votos

k999 comentado

Yo primero valido el formato de los datos del formulario en la máquina del usuario (Javascript), es decir, que el nombre sea solo texto, que el teléfono números, que el correo sea una dirección válida, etc. Una vez que el usuario envía los datos te toca "limpiarlos" del lado del servidor antes de ser insertados a la base de datos, para eso creas una función o expresión regular dependiendo del lenguaje que estés utilizando para limpiar el texto, quites tags html o código malicioso, quites espacios en blanco o saltos de línea, quites caracteres extraños, etc. Finalmente la estructura de tu base de datos debe tener otra "validación" (en los tipos de datos, llámese INT, VARCHAR, ENUM, etc.). Es decir, debes hacer la validación en las 3 capas (cliente, servidor y base de datos). Nunca hay que confiar en el usuario.

5 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola Elvis,

sanear y validar apuntan a diferentes cuestiones:

Sanear es sacar de la entrada al software todo cosa que pueda alterar su funcionamiento, ya sea por inyección HTML, inyección JavaScript, inyección PHP o inyección SQL. Cada tipo de inyección requiere un saneo diferente porque la naturaleza de cada problema está dada por cada lenguaje en particular.

Validar es verificar que los datos tengan sentido y coherencia para la acción que se esté realizando con los datos. Por ejemplo no agregar un registro con datos faltantes, no agregar registros duplicados, impedir realizar ventas en cuenta corriente que sobrepasen el límite de crédito, borrar registros de tablas que están siendo usados por otras tablas, etc.

PHP tiene funciones que permiten sanear la mayoría de los problemas como por ejemplo:

addslashes()
htmlspecialchars()
htmlentities()

La validación en cambio dependerá del Modelo de la aplicación y sus reglas de negocio.

Como sanear y validar son cuestiones distintas, siempre hay que hacer ambas.

Generalmente es mejor idea primero sanear y después validar, ya que el dato en concreto con el que se trabajará será el dato ya saneado, y sobre él se verificarán las validaciones del modelo.

Espero te aclare algunas cosas la respuesta. Saludos cordiales.

2votos

JALF Puntos180

Hola, mira yo hago así y quizas te ayude en lo que necesitas

  1. Paso lo datos provenientes del formulario por una función que me certifique que no hay una injección de datos mal intencionada.

  2. Valido los datos

  3. Hago lo que necesito hacer con los datos (guardar, actualizar o lo que sea)

4...... ps le digo al usuario "EXITO!!!"

Y creo que ya, es algo así lo que estabas preguntando?

2votos

ignorao Puntos270

Buenas Elvis.

Yo haría ambas cosas por 2 razones.

Como bien dices en tu pregunta posterior, la validación solo te va a decir que los datos introducidos tienen el formato especificado y seguramente ya te habrás ocupado de que puedas tener un problema de injección de código. Por decirlo de alguna manera,la validación la haces del lado del cliente.

Pero de parte del servidor también debes hacer esa "validación" (Sanitizar) si quieres estar seguro de que lo que añades en tu BBDD es algo totalmente seguro.

Un saludo.

2votos

En mi opinión el orden dependerá siempre de tus necesidades, aunque por lo habitual creo que deberías validar y después sanitizar.
Te pongo un ejemplo donde afecta el orden:

$passw1 = ' passw1  ';
$passw2 = '"passw2';
function sanitize($str){
    return addslashes(trim($str));
}
function validate($str){
    return strlen($str)>7;
}
function check($str){
    if(validate($str)) echo $str.' is valid(1) <br />';
    if(validate(sanitize($str))) echo $str.' is valid(2) <br />';
}
check($passw1);
check($passw2);

Básicamente lo que hace el código es ejecutar la función check() donde se valida primero, y luego se valida después de sanitizar.
La función sanitize() limpia espacios no deseados al comienzo y final de la cadena, y añade "\" a las comillas.
La función validate() comprueba que el tamaño del string sea 8 como mínimo.

  • La salida del primer check() será passw1 is valid(1) ya que los
    espacios cuentan en el tamaño del string, pero al sanitizarlo el
    tamaño se reduce y no pasa la validación.
  • La del segundo check() será "passw2 is valid(2) , y ocurre justo lo contrario que el caso anterior, ya que inicialmente el tamaño del string no pasa la validación, pero la barra "\" de escape que añade a la comilla doble afecta al tamaño, pasando la segunda validación.

De todas formas, por lo general creo que sería mejor validar, ya que atendiendo a términos de optimización (aunque rara vez tendrá relevancia aquí) la validación te puede "ahorrar" el paso de la sanitización si no pasa la validación. En cambio, al contrario nunca te ahorraría de validar.

1voto

lucianolagassa Puntos820

hola, en mi caso yo valido desde javascript y limpio desde php, te paso el codigo de la validacion via javascript, ojo este codigo no comprueva si los valores son correcto, ej: que el emil sea valido o el telefono tenga solo numeros, es para validar cualquier formulario y si algun campo esta vasio te lo resalta en rojo y luego se lo realta en verde para indicar que ya lo cempletaste.

function validar(formulario, espera)
{
 var i=0;
 var s=formulario.elements.length-1;
 for (i=0;i<=s;i++)
 {
  switch (formulario.elements[i].type)
  {
   case 'text':
    if(formulario.elements[i].value.length==0)
    {
     formulario.elements[i].style.borderColor='red';
     formulario.elements[i].focus();
     return 0;
    }
    else
    {
     if(formulario.elements[i].style.borderColor=='red')
     {
      formulario.elements[i].style.borderColor='green';
     }
    }   break;
   case 'textarea':
    if(formulario.elements[i].value.length==0)
    {
     formulario.elements[i].style.borderColor='red';
     formulario.elements[i].focus();
     return 0;
    }
    else
    {
     if(formulario.elements[i].style.borderColor=='red')
     {
      formulario.elements[i].style.borderColor='green';
     }
    }
   break;
   case 'select-one':
   if (formulario.elements[i].selectedIndex==0)
   {
    cadena = /--/ 
    if(cadena.test(formulario.elements[i].value))
    {
     formulario.elements[i].style.borderColor='red';
     formulario.elements[i].focus();
     return 0;
    }
    else
    {
     if(formulario.elements[i].style.borderColor=='red')
     {
      formulario.elements[i].style.borderColor='green';
     }
    }
   }
   break;
  }
 }
 if (espera=='true')
 {
  formulario.style.display='none';
  document.getElementById('espera').style.display='block';
 }
 formulario.submit();
}

0voto

nanomo comentado

Y si te sientes muy paranoico puedes usar PHP-IDS o similares, tendrás mas carga de seguro pero mucho menos probabilidad de olvidare de satinizar algo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta