Validaciones… ¿lado cliente o lado servidor?

Inicio / Buenas prácticas / Validaciones… ¿lado cliente o lado servidor?

La respuesta corta primero: las dos (y si sólo puedo elegir una, definitivamente del lado servidor).

Respuesta larga:

¿Por qué es más importante la validación del lado servidor que del lado cliente? Sencillamente porque tenés mucho más control sobre lo que sucede.

En una aplicación de escritorio (o digamos, una aplicación que no sea de tipo cliente-servidor) no existe este problema: la aplicación es una sola con lo cual, lo que el front-end captura puede ser considerado confiable y volver a realizar la validación en el backend resultaría redundante.

En cambio, en el entorno de una aplicación web (o una cliente-servidor), se trata realmente de dos aplicaciones independientes.

Pensá un momento en cómo es el modelo de ejecución de una aplicación web:

  1. El cliente realiza un pedido
  2. El servidor responde (probablemente con HTML y JavaScript)
  3. El cliente dibuja la página
  4. El usuario completa los datos
  5. El cliente realiza un nuevo pedido enviando los datos ingresados
  6. El servidor los procesa y eventualmente almacena
  7. El servidor responde
  8. El cliente interpreta la respuesta y dibuja la página

Desde el punto de vista del servidor, el pedido que se le realiza puede haber sido generado usando el HTML que él mismo ha enviado o no… imposible saberlo.

De modo que, en definitiva, los datos recibidos no pueden ser considerados confiables. Podés ver cómo “fabricar” un pedido cualquiera usando una herramienta como cURL.

Tomemos un sitio cualquiera como http://www.recruitersonline.com/members/ron4_add.php:

Si vemos el código fuente:

Podemos notar rápidamente que los datos que se introduzcan en este formulario serán enviados a ron4_add_thanks.php.

Valiéndonos de cURL podemos armar un pedido como:

Esto haría que el servidor reciba XXXX como valor del campo adm_first_name. Suponiendo que tal valor no sea aceptable y que la validación sólo se realizara a través de JavaScript… habríamos logrado saltearnos esta validación (Todo lo que hicimos fue hacer un pedido al mismo servidor a través de un cliente diferente).

De hecho, en este tipo de problemas se basan los ataques tales como sql injection.

Bueno pero entonces… ¿vale la pena hacer validaciones del lado cliente? La respuesta es un rotundo ¡SI!.

Las validaciones del lado del cliente son un favor que le hacemos a los usuarios bien intencionados que simplemente han cometido un error al ingresar información de buena fé.

El favor consiste en ahorrarles el round-trip al servidor con información que sabemos de antemano que será rechazada. Es cierto que hoy en día el tiempo de ida y vuelta se ha reducido en forma significativa, sin embargo, aún hay escenarios en los que puede hacer una diferencia (Por ejemplo en el caso de aplicaciones móviles donde la red es inestable o peor, se consumen datos del plan).

En conclusión: la validación del lado servidor es una necesidad mientras que la validación del lado cliente es una comodidad.

mchojrin

Director Académico y Docente at Leeway Academy
Hola! Soy Mauro Chojrin, estudié la Lic. en Ciencias de la Computación en la Universidad de Buenos Aires.

Me desempeño como docente de programación desde el año 1997.

Pasé por diferentes instituciones (Escuela Técnica ORT, Digital House, EducacionIT, ITMaster, Escuela DaVinci entre otros).

Actualmente coordino los cursos dictados en Leeway Academy y desarrollo sistemas usando PHP y framework Symfony

2 comentarios

  • Juan

    Hola Mauro, excelente artículo. Justamente estoy tratando de mejorar algunos de estos aspectos de seguridad para evitar por lo menos SQL injection, usando PHP.
    La pregunta es:
    ¿En Mysqli bastaría con usar
    $sentencia = $mysqli->prepare(“”);
    $sentencia->bind_param( );
    $sentencia->execute();

    o se puede utilizar algo más?
    Gracias

    • Hola Juan:

      Gracias por el comentario :).

      Es difícil decir lo que “bastaría”, pero definitivamente lo que estás pensando está bien orientado. Te recomiendo usar PDO igualmente (en lugar de mysqli).

      Acá tenés otro post donde hablo particularmente sobre tu problema 🙂

      Saludos!

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: