JavaScript: validación del lado del cliente versus del lado del servidor
¿Qué 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 Controlador.
Gran parte de la validación que hago consiste en validar datos a medida que los usuarios los ingresan. Por ejemplo, uso el keypress
evento para evitar letras en un cuadro de texto, establecer un número máximo de caracteres y que un número esté dentro de 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?
Impresionantes respuestas a todos. El sitio web que tenemos está protegido con contraseña y es para una base de usuarios pequeña (<50). Si no ejecutan JavaScript, enviaremos ninjas. Pero si estuviéramos diseñando un sitio para todos, aceptaría realizar la validación en ambos lados.
Como han dicho otros, deberías hacer ambas cosas. Este es el por qué:
Lado del cliente
Primero desea validar la entrada del lado del cliente porque puede brindar mejores comentarios al usuario promedio . Por ejemplo, si ingresan una dirección de correo electrónico no válida y pasan al siguiente campo, puede mostrar un mensaje de error inmediatamente. De esa forma, el usuario puede corregir todos los campos antes de enviar el formulario.
Si solo valida en el servidor, ellos deben enviar el formulario, recibir un mensaje de error e intentar localizar el problema.
(Este problema se puede aliviar haciendo que el servidor vuelva a representar el formulario con la entrada original del usuario completada, pero la validación del lado del cliente es aún más rápida).
Lado del servidor
Desea validar en el lado del servidor porque puede protegerse contra usuarios malintencionados , que pueden omitir fácilmente su JavaScript y enviar entradas peligrosas al servidor.
Es muy peligroso confiar en su interfaz de usuario. No sólo pueden abusar de su interfaz de usuario, sino que es posible que no la utilicen en absoluto, ni siquiera un navegador . ¿Qué pasa si el usuario edita manualmente la URL, 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 POST
solicitudes como si el usuario hubiera completado el formulario de búsqueda de cada compañía, luego las hubiera recopilado y ordenado todos los resultados. El formulario JS de esas empresas nunca se ejecutó, y era crucial para nosotros que proporcionaran mensajes de error en el HTML devuelto. Por supuesto, una API hubiera sido buena, pero esto era lo que teníamos que hacer) .
No permitir esto no sólo es ingenuo desde el punto de vista de la seguridad, sino que tampoco es estándar: a un cliente se le debe permitir enviar HTTP por cualquier medio que desee, y usted debe 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, incluso si usan un navegador, tendrán JavaScript habilitado.
Anexo - Diciembre 2016
Hay algunas validaciones que ni siquiera se pueden realizar correctamente en el código de la aplicación del lado del servidor y son completamente imposibles en el código del 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 publicación del blog que estás comentando todavía existe", o "ninguna reserva existente se superpone a las fechas que solicitaste", o "el saldo de tu cuenta aún tiene suficiente para cubrir esa compra". ". Sólo la base de datos puede validar de forma fiable los datos que dependen de datos relacionados. Los desarrolladores suelen equivocarse en esto , pero PostgreSQL proporciona algunas buenas soluciones .
Sí, la validación del lado del cliente se puede omitir por completo, siempre. Debe hacer ambas cosas, del lado del cliente para brindar una mejor experiencia de usuario y del lado del servidor para asegurarse de que la entrada que obtiene esté realmente validada y no solo supuestamente validada por el cliente.
Sólo voy a repetirlo, porque es bastante importante:
Validar siempre en el servidor
y agregue JavaScript para mejorar la capacidad de respuesta del usuario.
El beneficio de realizar la validación del lado del servidor sobre la validación del lado del cliente es que la validación del lado del cliente se puede omitir/manipular:
- 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 su página (causado por varias cosas) podría provocar que se ejecute parte de su validación, pero no toda.
En resumen: siempre, siempre valide el lado del servidor y luego considere la validación del lado del cliente como un "extra" adicional para mejorar la experiencia del usuario final.
Siempre debes validar en el servidor.
Además, tener validación en el cliente es bueno para los usuarios, pero es completamente inseguro.