Validaciones… ¿lado cliente o lado servidor?

Nadie duda de que los campos de los formularios que envían los usuarios deben ser validados.

Seguro eso es lo que te dijeron cuando empezaste a estudiar, lo que no es muy claro cuando se trata de programación web es cuál es la manera correcta de hacerlo.

En otras palabras, ¿cuáles son las mejores prácticas cuando se trata de validar?

Más allá de las herramientas que vayas a usar para realizar la validación, lo primero que debes responder es dónde debe realizarse esa validación, ¿en el cliente o en el servidor?

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

¿Querés más detalles? Te invito a acompañarme a la respuesta larga 🙂

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 una 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.

Cuando hablamos de una aplicación web, en realidad estamos hablando de dos aplicaciones independientes. Clic para tuitear

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 con HTML, JavaScript, CSS, etc…
  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. Vuelta al paso 2

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 simplemente usando un cliente diferente.

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

Pero entonces…

¿Vale la pena hacer validaciones del lado cliente?

¡Claro que 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).

La validación del lado servidor es una necesidad mientras que la validación del lado cliente es una comodidad. Clic para tuitear
mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

2 comentarios

  1. 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

    1. 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!

¿Te quedó alguna duda? Publica aca tu pregunta

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