Búsqueda de sitios web

seguridad - JavaScript: validación del lado del cliente vs. del lado del servidor


¿Cuál es mejor, hacer la validación del lado del cliente o del lado del servidor?

En nuestra situación estamos usando

  • jQuery y MVC.
  • Datos JSON para pasar entre nuestra Vista y el Controlador.

Gran parte de la validación que hago es validar datos a medida que los usuarios los introducen. Por ejemplo, uso el evento de pulsación de tecla para evitar letras en un cuadro de texto, pongo un número máximo de caracteres y ese número está con un rango.

Supongo que la mejor pregunta sería: ¿Hay algún beneficio en realizar la validación del lado del servidor en lugar del lado del cliente?

Respuestas increíbles, todos. El sitio web que tenemos está protegido con contraseña y es para un pequeño grupo de usuarios (<50). Si no están ejecutando JavaScript, enviaremos ninjas. Pero si estuviéramos diseñando un sitio para todos, estaría de acuerdo en hacer la validación en ambos lados.

Respuesta #1

Como otros han dicho, deberías hacer ambos. Aquí está el por qué:

Lado del cliente

Quieres validar la entrada en el lado del cliente primero porque puedes dar mejor retroalimentación al usuario promedio. Por ejemplo, si ingresan una dirección de correo electrónico inválida y pasan al siguiente campo, puedes mostrar un mensaje de error de inmediato. De esa manera, el usuario puede corregir cada campo antes de enviar el formulario.

Si solo validas en el servidor, tienen que enviar el formulario, recibir un mensaje de error e intentar buscar el problema.

(Este dolor puede aliviarse haciendo que el servidor vuelva a renderizar el formulario con la entrada original del usuario completada, pero la validación del lado del cliente sigue siendo más rápida.)

Lado del servidor

Quieres validar en el lado del servidor porque puedes protegerte contra el usuario malintencionado, que puede eludir fácilmente tu JavaScript y enviar información peligrosa al servidor.

Es muy peligroso confiar en tu UI. No solo pueden abusar de tu UI, sino que pueden ni siquiera estar usando tu UI en absoluto, o incluso un navegador. ¿Qué pasa si el usuario edita manualmente la URL, o ejecuta su propio Javascript, o modifica sus solicitudes HTTP con otra herramienta? ¿Qué pasa si envían solicitudes HTTP personalizadas desde curl o desde un script, por ejemplo?

(Esto no es teórico; por ejemplo, trabajé en un motor de búsqueda de viajes que volvía a enviar la búsqueda del usuario a muchas aerolíneas asociadas, compañías de autobuses, etc., enviando solicitudes POST como si el usuario hubiera rellenado el formulario de búsqueda de cada compañía, y luego recopilaba y ordenaba todos los resultados. El formulario JS de esas empresas nunca se ejecutó, y para nosotros era crucial que proporcionaran mensajes de error en el HTML devuelto. Por supuesto, una API habría estado bien, pero esto era lo que teníamos que hacer.)

No permitir eso no solo es ingenuo desde el punto de vista de la seguridad, sino también no estándar: un cliente debería poder enviar HTTP por los medios que desee, y tú deberías responder correctamente. Eso incluye la validación.

La validación del lado del servidor también es importante para la compatibilidad: no todos los usuarios, aunque estén usando un navegador, tendrán JavaScript habilitado.

Apéndice - diciembre de 2016

Hay validaciones que ni siquiera se pueden hacer correctamente en código de aplicación del lado del servidor, y son absolutamente imposibles en el lado del cliente, porque dependen del estado actual de la base de datos. Por ejemplo, "nadie más ha registrado ese nombre de usuario", o "la entrada del blog en la que comentas sigue existiendo", o "ninguna reserva existente coincide con las fechas que solicitaste", o "el saldo de tu cuenta aún tiene suficiente para cubrir esa compra". Solo la base de datos puede validar de forma fiable los datos que dependen de datos relacionados. Los desarrolladores suelen equivocarse con esto, pero PostgreSQL ofrece buenas soluciones.

Respuesta #2

Sí, la validación del lado del cliente se puede eludir totalmente, siempre. Necesitas hacer ambas cosas: del lado del cliente para proporcionar una mejor experiencia de usuario, y del lado del servidor para asegurarte de que la entrada que recibes esté realmente validada y no solo supuestamente validada por el cliente.

Respuesta #3

Solo voy a repetirlo, porque es bastante importante:

Siempre valida en el servidor

y agregar JavaScript para la capacidad de respuesta del usuario.

Respuesta #4

La ventaja de hacer validación en el lado del servidor frente a la del cliente es que la validación del lado del cliente puede ser evitada o manipulada:

  • El usuario final podría tener JavaScript desactivado
  • Los datos podrían ser enviados directamente a su servidor por alguien que ni siquiera está usando su sitio, con una aplicación personalizada diseñada para hacerlo
  • Un error de Javascript en tu página (causado por cualquier cantidad de cosas) podría resultar en que se ejecute parte, pero no toda, de tu validación

En resumen: siempre, siempre valide del lado del servidor y luego considere la validación del lado del cliente como un "extra" agregado para mejorar la experiencia del usuario final.

Respuesta #5

Siempre debes validar en el servidor.

También tener validación en el cliente es agradable para los usuarios, pero es totalmente inseguro.

Artículos relacionados