Controles de Validación – ¿Son Realmente Seguros?

Antes de empezar, se que este post puede ser vetado, por muchos motivos, solo quiero esperar que lo tomen de por el lado amable…, aquí muestro mis ideas y mi percepción al respecto, agradecería me dieran sus comentarios sobre esto, ni intento atacar a alguna persona en especial , la razón de este post es  poder ayudar a las personas a que  utilicen algo mas de seguridad en sus sistemas.


Este post se a vuelto una respuesta a un post puesto por un empleado de Microsoft, y en general a la imagen que da Microsoft y algunos expositores http://blogs.msdn.com/hackers/archive/2008/01/06/first-line-of-defense-for-web-applications-conclusion.aspx


ACLARACION :   “Este post no demuestra ninguna buena practica…, sino que  mas bien demuestra como “No deben de programar”; es la forma en la que muchos programan equivocadamente. Segundo, el ASP.NET SI hace una validacion del lado del servidor, aunque esta es una validacion  que  en este caso  es muy facil de saltarse, ya que no se ingresa codigo malicioso ( XSS, Sql Injection, etc ).    Y una cosa mas  sobre lo de “Page.IsValid esta omitido de  forma premeditada, para que el ejemplo sea mas facil de entender, pero aun asi,  si lo hubiera puesto… el resultado es el mismo, ya que  eso solo valida que no ingrese codigo malicioso :), esto a pedido de Misael :)


En los tiempos actuales se habla mucho sobre seguridad, ¿ pero esta realmente se aplica?


soy una persona que  utiliza diariamente las tecnologías de Microsoft, pero en mi trabajo como consultor en seguridad e visto muchos  vicios de programación, que han sido originados por una incorrecta forma ( a mi parecer ) de mostrar las cualidades de ASP.NET.


¿A que me refiero en especifico?  me refiero a los controles de validación, si , seguro habrán escuchados de ellos, el de campo requerido, el de  expresión regular, etc.


Eh Escuchado en Múltiples conferencias de Microsoft y en otras de algunos colegas expositores y  algunos ex colegas MVP’s ( si,  si..  yo fui el que dejo de serlo je je ) ,   sobre la idea de que “Los controles de Validación”, hacen que una aplicación sea segura, hace unos minutos estaba debatiendo esto con mi amigo Guino, sobre la Seguridad, y el me decía que la seguridad se implementa en varias capas, que no se puede implementar en una sola capa, con lo cual concuerdo, pero algo que le replique es sobre  que pasa si le das una imagen errónea a las personas sobre la seguridad, ya sea como Microsoft o  como Expositores, influenciamos a los desarrolladores, y esto influye en muchos aspectos de como programan…. ¿ si.. pero cual es mi punto ?


Mi punto es el siguiente:


Los Controles de Validación sirven para 2 cosas,

  • Para que el usuario común y silvestre… (si de esos que andan rondando libremente por allí… sin domesticar..) , puedan ingresar datos correctos en una determinada aplicación de una forma mas rápida, ya que antiguamente había el problema de los muchos postback  que eran molestos,  y como una guía para que ellos ( que nunca hacen las cosas como se debe ) puedan hacer un trabajo correctamente.
  • Para Evitar evitar demasiados postback ( si si ya lo había puesto )  ya que estos hacen que la aplicación sea mas lenta,  el trabajo para ese usuario común  y silvestre que no sabe  ni poner su apellido correctamente …. tenga que ir rellenando todo de nuevo por que escribió mal algo, y así liberamos algo de carga al servidor en cuestión.

Para que No Sirve :

  • No sirve para Implementar seguridad real, como dije antes esto sirve solo para que el usuario común y silvestre ingrese la información correcta, o quizá pueda contra un simple y diminuto “Lamer” , pero sobre seguridad real no ayuda en nada, como me dijo Guino “¿¿que código JavaScript es seguro..??” el código JavaScript, en su mayoría tiene como finalidad darle una mejor experiencia al usuario, es código muerto que no corre bajo el CRL, eso si puede ser generado…

En muchas literaturas, se habla sobre código seguro y e ellas se dice ( algo en lo que estoy de acuerdo)  “que se tiene que validar todas las entradas de usuario, una y otra vez, que no hay que confiar en nada que venga del usuario” en conclusión el usuario es un ser  en el cual no se puede confiar…  hasta allí todo muy bien y correcto…. pero ahora viene lo malo…. ¿como?


Muchas personas interpretan eso ( sobre validar las entradas del usuario)  con validar usando controles de validación..  y que con eso su aplicación ya es segura y recibirá siempre los datos correctos , cosa que no es cierto… lamentablemente las personas no acostumbran desarrollar código seguro, y se confían de que el CRL del ASP.NET les ayudara en todo.


hace un tiempo salió una vulnerabilidad que demostró que el “Validate Request” del ASP.Net no es “invulnerable” http://www.buayacorp.com/archivos/validaterequest-no-es-suficiente-para-protegernos-de-ataques-xss/ , y en este otro post se muestra la mínima validación que hace el “validate request” http://www.buayacorp.com/archivos/seguridad-en-aspnet-xss/ ,  asi que por eso no podemos confiar en que eso ayudara en la seguridad, quizá si filtrara muchos de los intentos, pero.. no podemos confiar en que eso hará nuestras aplicaciones seguras.


Si reconozco que en seguridad ASP.NET a dado un gran salto, ya que por ejemplo en aplicaciones PHP  hay que hacer a mano muchas de las validaciones, pero aun así tenemos que seguir programando pensando en seguridad… pero en seguridad real.


Seguro pensaran…  este mucho habla y poco demuestra…o este es un charlatán…. pero calma, ya viene lo bueno…. pero adelanto.. que no diré exactamente el como lo hago pero si mostrare imágenes que de por si ya mostraran.


empecemos!. para el ejemplo siguiente crearemos una simple pagina ASP.NET Con un simple botón, una caja de texto y le agregaremos un control de validación….  haber podría ser cualquiera, para este caso pongamos el de “Regular Expression Validator”, y  como expresión a validar pongamos la de “email”,  como muestra la imagen:



el único código que le aplicaremos en este caso, será el siguiente:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Response.Write(TextBox1.Text)

End Sub

como ven   simplemente escribe  lo que recibe de la caja de texto… lógicamente el evento clic no se ejecuta si es que no sea cumplido  la condición del control de validación… por si no creen aquí les dejo otras imágenes… en la primera lo que pasa si no pongo la condición correcta ( un email )



y si se cumple se muestra algo asi:



allí se escribió el email


Bueno luego prendemos el Paros ( véase el anterior post que  puse Previo a un Post Importante, Herramienta impresincible ) , para la configuración de ese soft pueden ver en la ayuda…  de su programa… si .. deben de leer.., bueno para poder atrapar el trafico habilitamos en la pestaña trap, la opción de “trap response” y “trap request” y llamamos a la pagina, lógico que se  detendrá y no avanzara hasta que  en el paros le demos en “Continue” varias veces. hasta que se carga la pagina y en el paros ya no se ve nada…,


luego simplemente escribimos un email ( ósea un valor que cumple la condición ósea algo@algo.com )   y damos clic en el botón, lógico que paros capturara el evento. y veremos algo así….



se dan cuenta… quizá en este momento seria buena idea para cambiar el valor puesto originalmente por el que realmente querremos poner… en este caso pondré “datocambiado” y ponemos “continue” el siguiente clic mostraría el HTML que se procesara.. ( ósea el que validara…)  y si buscamos en el código podríamos ver algo asi :



ven algo conocido?… algo parecido a una expresión regular..?.. que pasaria si modifico lo que esta entre las comillas y por ejemplo dejo solo : \\w+([-+.\’]\\w+)*…  y luego doy en continue…   seran como 4 clic en continue y luego ya de hacer todo eso podremos ver en el navegador :



ven? aparecio el dato que modificamos..


como quizá digan, “pero no te metiste a la DB  o no hiciste cosas complicadas… ” … y les respondería… justo es lo que quería hacer… demostrar lo simple que es saltarse los controles de validación,    y en que casos nos puede afectar esto?  es simple…


en el mundo actualmente existen muchas personas ( lo e comprobado ) que equivocadamente piensan que lo que en los libros de código seguro dice  “valida la entrada” significa usar controles de validación… y eso significa que no tenemos que meternos dentro de la app, robar sesiones ni cosas asi para poder hacer destrozos…  ejemplos..? ya depende de cada uno….,


Esto es un bug?  personalmente creo que NO, pero eso es por que yo desde un principio considere a los controles de validación como algo para ayudar a los usuarios  a ingresar bien los datos, pero no como algo para seguridad…,  lo que si creo que es un Error o Bug, es a las personas  que enseñan y  dan a entender que esto hace que la aplicación sea segura, lo cual es falso, quizá podríamos decir “esto  seria uno de los puntos en los cuales puedes  ayudar a que tu aplicación sea segura”,pero siempre aclarando explícitamente que el fin de esto no es la seguridad, sino que mejora la experiencia del usuario.


creo personalmente que Microsoft debería  de cambiar su forma de mostrar este tipo de controles, ya que esta haciendo que las personas tengan una perspectiva equivocada  de esto, aunque lógico si me hacen caso o no ya no depende de mi .


y Bueno luego de este rollo.. que podemos hacer?  la respuesta es simple “Validación en el lado del Servidor”, ojo que no digo que “no hagan validación del lado del cliente” , lo que digo es que hagan doble validación, bueno al menos en este aspecto.


quiero agradecer a Nazul por haberme proporcionado el link donde se habla de los controles de validación…..


Bueno espero  no haber ofendido a nadie con este post, ni tampoco quiero atacar a Microsoft,tan solo doy mi punto de vista con respecto a ese post y en general a los controles de validación.


Si no Es Vetado este post, podría poner otros tips de seguridad, ya sea en .net o en servidores Windows… .. mas información?  : http://www.google.com


Hasta la proxima!


Salu2


Ddaz ( El Dacito )


:) Publicacion cruzada desde Geeks.ms :) http://geeks.ms/blogs/ddaz

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>