Cómo validar la entrada del usuario

5

Tengo muchos problemas para entender dónde puedo validar, como desarrollador, los datos que mis usuarios me envían. Digamos que para un ejemplo simple tengo una página web donde tiene un formulario simple que contiene tres campos:

Name -> text field
email -> text field
Lunch Choice -> Dropdown field
  values:
    Burger
    Hotdog
    Pizza

Una vez que el usuario envía el formulario, su nombre y orden se guardan y pueden recoger su almuerzo al día siguiente.

Si soy un usuario vicioso y llego a este sitio y edito el html para decir que el valor de la pizza es en realidad una ensalada y el valor de la opción es otro valor.

Ahora, cuando se envía y se guarda el formulario, se introducen algunos datos erróneos en la base de datos.

¿Dónde puedo detener esto?

Mi primer pensamiento fue tener alguna validación de javascript, hacer una llamada ajax al servidor para asegurarse de que los valores solicitados son válidos. Esto suena como una gran idea, excepto que javascript se ejecuta en el cliente, no en el servidor, por lo que también es susceptible de ataque.

Si permito que el usuario envíe el formulario y luego maneje el envío en el servidor y haga la comprobación allí, ¿el usuario ya ha enviado el formulario, por lo que necesitaría hacer algún tipo de redirección a su formulario?

Estoy seguro de que no soy el primer desarrollador en tener preguntas sobre valores de entrada y me preguntaba si existe una mejor práctica para manejar este tipo de problema.

Gracias de antemano!

    
pregunta jacksonecac 29.06.2017 - 20:06
fuente

5 respuestas

5

Es una pregunta básica. Debe validar TODO en el lado del servidor. El back-end es el lugar correcto para hacer validaciones. Por supuesto, las validaciones de javascript también son útiles para llevar a los usuarios estándar a los valores correctos, pero para los piratas informáticos (o cualquier usuario avanzado) es muy fácil de engañar.

Se supone que tiene una base de datos en el back-end y sabe qué tipo de alimentos se pueden asignar a cada usuario. Debe verificar si el valor recibido está presente en el conjunto de registros válido. Si está bien, puede continuar con su flujo de trabajo. Si no, puede mostrar un error y detener el proceso.

Otro problema importante al que te enfrentarás no es solo el desvío lógico. Tenga cuidado con los caracteres especiales y filtre todos los peligros, como comillas simples, comillas dobles, guiones, puntos y comas, etc.… o se enfrentará también a una inyección de sql o un ataque XSS (scripts entre sitios). Esa es otra historia ... pero la menciono porque también es muy importante.

    
respondido por el OscarAkaElvis 29.06.2017 - 20:16
fuente
2

Oscar ya publicó una gran respuesta, pero en respuesta a algunas de sus preguntas:

  

Mi primer pensamiento fue tener alguna validación de javascript, tener un ajax   llame a talk al servidor para asegurarse de que los valores solicitados sean válidos.   Esto suena como una gran idea, excepto que javascript se ejecuta en el cliente,   no el servidor, por lo que también es susceptible de ataques.

Eso está complicando las cosas. Como dijiste, esto es susceptible de ser atacado y, además, se anula completamente cuando Javascript está deshabilitado en el navegador.

  

Si permito que el usuario envíe el formulario y luego maneje el envío en el   servidor y hacer la comprobación allí, el usuario ya ha enviado el   ¿Así que necesitaría hacer algún tipo de redirección a su forma?

Sí.

Tradicionalmente, si desea usar la validación JS, lo hace para sugerir correcciones en la interfaz. "Oye, no hay ninguna @ en tu dirección de correo electrónico. Ingresa una dirección de correo electrónico válida". Esto te ahorra el viaje de ida y vuelta que describiste anteriormente. Javascript no es para hacer cumplir la seguridad, es para hacer cumplir una mejor experiencia de usuario.

Luego, una vez que ingresan una dirección de correo electrónico válida y envían su contenido, ya no hay forma de que omitan sus mecanismos. La pelota está en tu tejado. En el servidor, verifica las cosas desagradables que menciona Oscar, desinfecta todas las cadenas y si detecta algo incorrecto, devuelve al usuario a la página de entrada (y si desea ser amable, vuelve a llenar los campos del formulario utilizando los valores desinfectados ).

En este punto, incluso si JS estaba deshabilitado, el usuario aún recibe un mensaje HTML que explica que deben ingresar una dirección de correo electrónico válida. Sí, esto significa crear dos conjuntos diferentes de mensajes de error: uno para JS, uno en HTML (por lo que personalmente nunca me molesto con la validación de JS).

Solo tenga cuidado de volver a mostrar cualquiera de los contenidos que le proporcionaron. Si incrustaron código malicioso en las cadenas, mostrarlas en la página resultante sin eliminarlas primero puede terminar mal.

    
respondido por el Ivan 29.06.2017 - 22:28
fuente
2

Realizar validación de entrada significa verificar su entrada para asegurarse de que pueda procesarla. La parte difícil es que al validarlo, ya estás haciendo un procesamiento menor y eso puede crear una vulnerabilidad oculta.

El primer paso suele ser validar la longitud de la entrada. La mayoría de las entradas aterrizarán temporalmente en un búfer finito. Asegúrese de que la cantidad de entrada que copie en el búfer no exceda la longitud del búfer; si hay demasiada entrada y no hay suficiente búfer, esto puede crear un problema clásico de "desbordamiento de búfer"; explotar estos es un elemento básico de los hackers.

El siguiente paso es asegurarse de que los datos estén en el formato que espera. Si está esperando un número, asegúrese de que los bytes contengan solo dígitos y símbolos de números permitidos, como más, menos, separador, punto decimal, símbolo de moneda, etc. Tenga en cuenta que estos son específicos del lugar: en EE. UU., Un millón de dólares podría ingresarse como 1,000,000.00 , mientras que en Alemania se podría ingresar un millón de euros como 1.000.000,00 . Si está esperando caracteres y números alfanuméricos, use una "lista blanca" para aceptar solo los caracteres que espera. Es más seguro confiar en una lista blanca de caracteres buenos que en una lista negra de caracteres malos; su lista negra puede mantenerlo seguro con su configuración a partir de hoy, pero digamos que alguien en el futuro reemplaza su base de datos con una base de datos diferente. Es posible que uno de los caracteres inesperados permita una inyección de SQL. Lo mismo ocurre con las secuencias de comandos y HTML.

Tenga en cuenta que si revierte estas comprobaciones y prueba caracteres especiales antes de verificar la longitud de entrada, su código de validación podría ser vulnerable a un desbordamiento de búfer. Es importante hacerlas en el orden que te mantiene más seguro.

Por lo tanto, el siguiente paso es codificar adecuadamente la entrada. Por ejemplo, si va a aceptar < y > y coloca los resultados en una página web, probablemente querrá asegurarse de que está codificando los símbolos en HTML para que no cree un agujero inadvertidamente. donde un atacante puede plantar un <script>attack!</script> en la página de salida.

También se recomienda intentar proteger contra las inyecciones SQL aquí (proteger a alguien que ingresa algo malo como ' OR 1=1;DROP TABLE STUDENTS-- , pero es un arma de doble filo, ya que no garantiza completamente la protección. Puede intentar evitar esto colocando una verificación de validación contra la aceptación del carácter de apóstrofo. La siguiente línea de defensa debe estar en el código que se relaciona con SQL, y ese código debe ser responsable de ejecutar las consultas de forma segura (utilizando consultas SQL parametrizadas, ORM u otra estrategia defensiva). Puede hacer una prueba de escritura de su entrada contra el ataque de inyección de SQL anterior y no encontrar una falla porque solo conoce el tipo de ataque de inyección. Pero supongamos que el atacante descubre una nueva vía de ataque y trata de usar la codificación HTML para obtener Alrededor de su cheque, y resulta que olvidó probar y / o desinfectar ese tipo de entrada. Aún podría ser vulnerable a menos que tenga cuidado con la codificación SQL. Este es un pequeño ejemplo de cómo una defensa en La estrategia de profundidad puede ayudarte a mantenerte seguro.

    
respondido por el John Deters 30.06.2017 - 00:04
fuente
1

Para evitar que se escriban datos inesperados en la base de datos, valídelos en el lado del servidor, justo después de enviar el formulario, mediante el script / proceso que lo recibe.

Cualquier dato recibido de una fuente externa debe tratarse como potencialmente malicioso, por lo tanto, todo proceso que lo reciba debe desinfectarlo antes de procesarlo.

El objetivo de validación del lado del cliente es proporcionar una interfaz fácil de usar. El objetivo de la validación del lado del servidor es garantizar que la entrada del usuario sea amigable.

Recomiendo hoja de referencia de validación de entrada de OWASP y Hoja de referencia de prevención de inyección SQL .

    
respondido por el Krzysztof 29.06.2017 - 22:35
fuente
0

Valide y desinfecte todas las entradas de usuario

Básicamente hay dos tipos de validación , uno es esencial (lado del servidor), uno es deseable para UX (lado del cliente)

Validación del lado del cliente

La validación del lado del cliente que se produce en el navegador, antes de que los datos se hayan enviado al servidor. Esto es más fácil de usar que la validación del lado del servidor, ya que da una respuesta instantánea.

Dentro de eso hay una validación basada en navegador y enfoques basados en API / JS basados en restricciones de HTML5.

  • La validación integrada de formularios se realiza con las características de validación de formularios HTML5, y generalmente no requiere JavaScript. Esto tiene un mejor rendimiento, pero no es tan personalizable.

  • La validación de JavaScript se codifica mediante JavaScript. Es completamente personalizable pero también completamente anulable y evitable

Validación del lado del servidor

La validación del lado del servidor es la validación que se realiza en el servidor, después de que se hayan enviado los datos: el código del lado del servidor se utiliza para validar los datos antes de que se ingresen en la base de datos, y si es incorrecto, se envía una respuesta al cliente para decirle al usuario lo que salió mal. La validación del lado del servidor no es tan fácil de usar como la validación del lado del cliente, ya que requiere un viaje de ida y vuelta al servidor, pero es esencial: es la última línea de defensa de su aplicación contra datos erróneos. Todos los marcos del lado del servidor populares tienen características para validar y sanear los datos (haciéndolos seguros).

Da crédito al increíble mozilla por el texto de arriba y Definitivamente recomiendo la lectura.

    
respondido por el Luke 05.07.2017 - 13:58
fuente

Lea otras preguntas en las etiquetas