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 )

30 comentarios en “Controles de Validación – ¿Son Realmente Seguros?”

  1. Buenas. Muy bueno el post.
    Sin embargo tengo una duda; los controles de validación tienen una parte de cliente y otra de servidor.
    Siempre que utilizo los validadores, en el código de servidor llamo al método Page.Validate() y luego pregunto a la propiedad Page.IsValid.

    Validate();

    if (IsValid)
    {
    Response.Write(TextBox1.Text);
    }

    ¿Tú método se saltaría también esta validación?

    Un saludo

  2. Muy bien post, pero coincido con pacoweb… Tratere de probarlo
    Saludos…

    P.D. no veo porque deberian de vetarte… Tu paranoia ya esta grave…. ñ_ñ (es broma)

  3. Hola PacoWeb,

    sobre lo del “Validate” y el “IsValid”, validan que no haya ingresado codigo malicioso,y en el ejemplo no puse nada de codigo malicioso, aunque en un post como este : http://www.buayacorp.com/archivos/validaterequest-no-es-suficiente-para-protegernos-de-ataques-xss/ se demuestra que las validaciones son muy simples y en el pasado ya hubieron formas de hacer pasar por el arco del truinfo las validaciones.

    ya probe y si pude, logicamente que lo de este post no es suficiente, tienes que leer un poco del javascript que te genera la pagina sobre las funciones que pone algunos false los pones como true… y cosas asi… ( en si ni tendrias que quitar la funcion a validar…, seria como cuando crackeamos algo y en el codigo ensamblador cambias el si por el no…, logico que en exadecimal )

    un ejemplo de uso de esto es por ejemplo.. tienes una app de registro y pides el email, eso lo guardas en una db y luego tienes un servicio que envia notificaciones a todos los emails de esa db…, pero que pasa si entre esos… hay un email que no es email..? pueda ser que el servicio colapse… y uf hay muchas infinidades de situaciones, cuando uno no hace una validacion del lado del servidor, y solo se limita a validar en el cliente.

    Salu2

    Ddaz

  4. Hola Bruno:

    Concuerdo al 100% contigo, en si ese es lo que quiero dejar en claro, por eso puse que no considero esto como un Bug de MS, sino como un error de enfoque de las personas, hay que distinguir que esos controles sirven para que los usuarios comunes y silvestres la pasen bien… y no como seguridad, al menos en el lado del cliente.

    Mi meta es ver si podemos ayudar a las personas a que se esfuercen mas por hacer codigo seguro, no solo codigo bonito.

    gracias por tu comentario.

    Salu2

    Ddaz

  5. Hola  EliudBd :

    en si no era solo por mi paranoia, este post no viene de ahora ya tenia tiempo y antes de publicarlo lo comente a algunos amigos y me recomendaban que no lo publique, por lo mismo, o que al menos primero avise a MS internamente ( aun estoy en deuda de eso)… una de las cosas es que mi NDA de mvp aun no caduca, por mas que yo caduqué  como mvp ( a finales del 2006 ) el nda dura 5 años , antes ya e tenido unos lios con el area legal de MS.. y creeme no es una muy buena experiencia… aunque como dicen.. lo gozado nadie me lo quita!!…

    Pero por que el posible veto? .. .te cuento algo… hace años, cuando nadie sabia de los keyloogers, pocas personas sabiamos usarlos, tambien  los troyanos como el Sub7 y otros…, pero en algun instante… alguien le digo a los usuarios comunes y silvestres ( sin conocimientos tecnicos) como usarlos… y ahora casi todos los cyber ( donde alquilan internet) o entre los mismos familiares se ponen entre ellos eso, se volvio como una epidemia de keyllogers y demas…( por suerte solo son conocidos los simples.. no de los que son casi indetectables realmente jeje ), eso por que alguien lo publico…, lo que puse en el post no es solo una idea mia de un “posible bug” es algo que e visto en mi trabajo como consultor en seguridad, vi multiples aplicaciones que tienen ese y otros errores mas…, asi que si alguna persona maliciosa  se le ocurre buscar… es casi seguro que  encontrara un sitio vulnerable… y quien tendria la culpa???. … como ya es costumbre entre mis amigos, MS y mis familiares.., logico sin olvidar a los que se dicen mis enemigos…  “El Ddaz”. jeje

    Salu2

    Ddaz

  6. Tienes un tremendo error de conceptos.

    Una cosa es la validación y OTRA distinta la seguridad, como ya dijeron en otro comentario.

    La seguridad se debe manejar SOLO del lado del servidor.

    Lo que esté del lado del cliente SOLO es un front-end que generalmente debe ser vistoso y usable. Justamente en la parte de usable entran las validaciones que nombras en este post, que permiten que un usuario sepa hablar mejor con la aplicación.

  7. claro que entiendo la diferencia, y justo por eso es el post, por que las personas confunden validacion con seguridad… por eso “demostre” por que validacion no es lo mismo que seguridad. busca un poco en google y veras que muchas personas confunden los conceptos, y piensan que implementar validacion hace las webs seguras.

    salu2

    Ddaz

  8. Hola jose de nuevo:

    en algo no concuerdo contigo ( no lo puse en el anterior comentario), es que la seguridad “Solo en el lado del servidor”, eso es totalmente falso, la seguridad no esta en un solo lado, sino que se implementa gradualmente en todas las capas de la aplicacion, por ejemplo a este ejemplo que puse anterior, yo dentro de mi trabajo lo automatice con un bot, que lee el stream, modifica los datos y devuelve parametros modificados, ( lo hice hace tiempo para unas pruebas automatizadas, a un sistema, logicamente eso si no puedo publicar.. ) , y una app normal es vulnerable a ataques automatizados, pero para eso se creo Captcha (http://es.wikipedia.org/wiki/Captcha), implementando eso pones un poco de seguridad del lado del cliente, y asi te evitas de este tipo de ataques, otro ejemplo ( no en .net) seria http://blog.antioroku.com/archivo/69 , donde tambien se ve como implmentar seguridad…, por eso la seguridad tiene que ir en todas las capas de la aplicacion, no solo en una, logicamente entendiendo bien a que nos referimos con seguridad.

    Salu2

    Ddaz

  9. Creo que con este post también estas contribuyendo a dar una mala información sobre los controles de validación.

    Los controles de validación de .Net hacen verificaciones tanto del lado de cliente como del lado del servidor, en el ejemplo que expusiste no es necesario modificar la petición web que estas realizando, bastaría con deshabilitar la ejecución de javascript en el navegador para que obtuvieras el mismo resultado.
    El ejemplo que expones es incorrecto, ya que no estás utilizando de manera correcta el esquema de validación que tiene consigo Asp.Net (no únicamente los controles de validación) Asp.Net realiza validaciones de seguridad en las que incluye mandar a llamar las validaciones de seguridad de los diferentes controles de validación que hereden de la clase BaseValidator.
    Para comprobar que la página tiene un estado valido solo hay que mandar a llamar al método Page.IsValid.

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    if Page.IsValid Then
    Response.Write(TextBox1.Text)
    Else
    Response.Write(“El valor no es valido”)
    end if
    End Sub

    Los validadores de .Net están hechos para fines específicos y cumplen de manera correcta su objetivo,

  10. Hola,

    Como puede verse, por ejemplo, aquí:

    http://samples.gotdotnet.com/QuickStart/aspplus/doc/webvalidation.aspx

    (“The validation controls always perform validation checking in server code”)

    Las condiciones que establecen los validadores se ejecutan opcionalmente del lado del cliente mediante Javascript y *SIEMPRE Y DE MANERA AUTOMATICA* del lado del servidor.

    Salvo excepciones documentadas, no es necesario llamar a Validate(); lo que no se puede olvidar es preguntar por IsValid en el cuerpo de los eventos de servidor que programemos.

    Saludos – Octavio

  11. hola a los 2:
    Cool!!!! esto ya se esta poniendo interesante 🙂

    como los 2 estan poniendo casi lo mismo les respondere en uno solo :).

    si puse un ejemplo tan simple ( sin el page.isvalid ) , era por que esto era casi casi como un hola mundo, en este caso en especifico las validacionoes normales de aspnet son pasadas sin problemas, ya que los esquemas de seguridad bloquean “codigo malicioso” el cual consiste en “

  12. Jeje en si a los del msn … solo le pase a 6 personas ( de mis mas de 400 contactos… ), ya que al ser fin de semana todos esta de vagos y solo unos cuantos andamos conectados :), pero en si no soy tan spammer… pero si dio resultado, ya que diste tu opinion :), que era lo que queria… y a Octavio aun no lo tengo en el MSN (que yo sepa, o quiza si y no lo hubico ) pero lo que si es fijo es que no le pase a el la liga:)

    Salu2

    Ddaz

  13. David: captcha o cualquier otro, tienen su logica en el servidor. Ninguna lógica de cliente, tratándose de aplicaciones web se puede tratar como lógica de seguridad. No tiene sentido ya que todo lo que está del lado del cliente, incluyendo las peticiones http, pueden ser fácilmente modificadas por software.

    Es decir, sos libre de poner lo que quieras del lado del cliente pero pensar que tu app es más segura es incorrecto.

    PD: ahora viene el “mea culpa”.. siendo sincero no lei tu post completo (es muy largo :S) y entendí (mal de mi parte) que vos equivocabas conceptos. Si bien ahora tampoco lo lei completo (sigue siendo igual de largo) veo que tu intencion era mostrar que los controles de validacion de asp.net no eran sinonimos de seguridad.

    PD2: no me quedó claro que tiene que ver este post con enviarle un mail al team de asp.net ?

  14. Muy buen artículo ddaz, y pues leyendo los comentarios anteriores, veo que recalcan mucho la diferencia de conceptos(entre validación y seguridad) pero creo que en tu artículo si dejas a entender que hay diferencia, pero algo que veo, es que si puedes “evadir” una validación en un formulario, obvio la seguridad se ve muy comprometida, por lo que pienso que se debe dar mucho énfasis a una validación fuerte.

    Gracias por ayudar a que consideremos este “bug” para implementar soluciones seguras 🙂

  15. Hola de nuevo jose:

    bueno puse lo de captcha por que algo de la funcionalidad llega al cliente ( en cambio los metodos que programemos de validacion del lado 100% del servidor) no interactuan directamente con el cliente y bueno ese es un metodo, que si al menos no es un 100% seguro ( ningun metodo lo es ) dificulta las cosas, y ese si seria un ejemplo de usar seguridad.. hay otros metodos … , aunque de echo no considero que sea suficiente :), pienso que la seguridad es un proceso largo que se tiene que aplicar en todas las partes de la aplicacion.

    y sobre lo de que no leiste .. jeje si entiendo.. tengo ese problema de extenderme demasiado… pero en este caso si no ponia todas mis ideas de forma explicita podia darse una malinterpretada.. aunque no tome en cuenta de que mucho rollo hace que no lean!! ese es un bug mio en este post jeje…

    y sobre lo del team… si te fijaste puse explicitamente como explotar una posible vulnerabilidad a una aplicacion…, normalmente esto esta vetado… ya que lo correcto es que hablemos de la vulnerabilidad, como corregirlo pero normalmente es recomendable no decir el como… y ademas de eso muchas veces tenemos opiniones en pro o en contra de cosas de microsoft.. pero no se lo hacemos llegar… y mientras ellos no sepan lo que pensamos, no podria corregir o aclararnos la situacion, por eso lo mejor es decirles nuestra forma de pensar u opiniones al respecto y ellos luego te dicen si te equivocas o no jeje… ahora microsoft esta mucho mas abierto para recibir opiniones externas :).

    salu2

    Ddaz

  16. Gracias por responder.
    Se ha generado un debate muy interesante. He aprendido algunas cosillas.
    Una opción que también utilizo para la validación son los CustomValidators; de esta forma puedes controlar de forma más efectiva en el servidor los datos que te llegan sin renunciar al modelo de validación de ASP.NET.

    Un saludo

  17. Hola Pacoweb :

    que bueno que te haya servido de algo todo este loquerio :)… a mi tbm me parece interesante las opciones que proponen.

    Sobre lo que dices del CustomValidator, es lo mismo si solo usas validacion del lado del cliente, por eso lo correcto es que uses validacion del lado del servidor, ademas de las validaciones que puedas hacer en el lado del cliente…

    un ejemplo, echo por misael que me parece correcto, ya que usa validacion en los 2 lados, esto es lo que se podria decir correcto con respecto a las validaciones… validar en uno y en otro lado.
    http://www.elguille.info/colabora/NET2005/neo_mx_CustomValidator.htm

    Hasta Luego

    el Dacito

  18. Joven Dacito:

    Sigues mezclando los conceptos Validadores contra validación de Seguridad

    En el ejemplo que elaboraste estás haciendo referencia a un VALIDADOR en el cual su único cometido es VALIDAR (no realizar comprobaciones de seguridad) que una dirección de correcto electrónico este con el “formato” correcto. En tu ejemplo haces referencia a que es un posible bug pero dista mucho de serlo ya que en la demostración de tu ejemplo se basa en un error tuyo al no comprobar el resultado de las validaciones del lado del servidor.
    Ahora bien, en la parte de la propiedad ValidateRequest como bien comentas solo realiza validaciones básicas ya que no utiliza ninguna técnica de detección como lo pueden hacer productos del tipo de http://www.microsoft.com/forefront/default.mspx. La utilización de la característica ValidateRequest solo es una medida de prevención y Microsoft recomienda siempre realizar validaciones EXPLICITAS como lo puedes leer en el siguiente url (http://msdn2.microsoft.com/en-us/library/system.web.httprequestvalidationexception.aspx) del cual tomo el siguiente abstracto

    “Request validation detects potentially malicious client input and throws this exception to abort processing of the request. A request abort can indicate an attempt to compromise the security of your application, such as a cross-site scripting attack. It is strongly recommended that your application explicitly check all input regarding request aborts.”
    Tu ejemplo está mezclando conceptos y además está programado de una manera incorrecta, por lo cual el mensaje que estas transmitiendo es incorrecto.

    Saludos

  19. Hola Misael:

    Bueno en si creo que no estas entendiendo mi punto, el ejemplo que yo puse “no es una buena practica” y tambien aclare que no es un “bug de MS”, lo que trato de mostrar es lo que pasa cuando “NO hacen una validacion en el servidor” ya que muchos desarrolladores, solo se limitan a usar la validacion en en cliente…( aunque no lo creas si) por eso lo que puse ya en mas de una vez es que “debe de haber una validacion en el servidor” ademas de la validacion en el cliente…

    Aunque no lo creas e visto en conferencias de MS, y de personas que no son empleados de Ms donde dan la imagen de que esos controles sirven para Seguridad, dan una mala imagen,y por eso muchos desarrolladores tienen la idea equivocada de que estos controles sirven para seguridad.

    no digo que estos tengan una vulnerabilidad, ya que cumplen su funcion para lo que estan echos… validar la entrada del usuario…, pero no para seguridad… si queremos asegurar la aplicacion tenemos que hacer validaciones “a mano”… el detalle es que esa parte del mensaje que pones de “validar a mano” es la que no esta llegando a muchas personas y justo ese es mensaje de este Blog.

    el ejemplo del email y de que puede ser una vulnerabildad, lo digo por que e comprobado, recuerda que la palabra seguridad implica muchas cosas , no es solo que te hagan un XSS o un SQL Injection.. seguridad implica que tu aplicacion trabaje al 100% con los datos correctos:), entre otras cosas :).

    solo recuerda… no estoy poniendo alli “una buena practica”… lo que pongo alli es lo que pasa cuando “programan mal”, por eso es que repito y repito “Validen en el lado del Servidor”

    Salu2

    Ddaz

  20. Comprendo tu punto y como bien dices tu ejemplo NO esta de ninguna manera realizado con las mejores practicas lo cual no especificaste en ningún momento (hasta ahorita) por lo que caiste exactamente en lo que criticabas (el mal enfoque que le han dado). Sin embargo esto ya parece un ciclo sin fin.

    Salu2

  21. Hi:.

    bueno Ya puse la aclaracion en el mismo post 🙂 y en “Bold”. Acepto que me falto ponerlo explicitamente en el post, 🙂 pero al menos se dio a entender la idea, y bueno como ya platicamos por msn, esta parte de la discusion la doy por cerrada.

    Salu2

    Ddaz

  22. A ver, a ver… Que yo me aclare…

    ¿Entonces la propiedad Page.IsValid NO te dice si todos los controles que tienen un Control de Validación asociado, están correctos? Porque esto es lo que dice la mismísima MSDN, no?

    “For this property to return true, all validation server controls in the current validation group must validate successfully”. Y por “validate successfully” yo entiendo “cumplir con los patrones de validación que has establecido”. Por ejemplo que en un textbox has usado un RegExValidator y el texto que has introducido se ajusta a esa RegEx definida.

    Supongo que el problema debe venir (y ahí es donde debe intervenir esa parte del motor de ASP.NET) cuando dejas al usuario que te introduzca cualquier tipo de caracter en los textboxes. Aunque por lo que ha demostrado David Daniel manipulando los datos HTTP, es indiferente que a un usuario malicioso le apliques un RegEx super-restrictivo… PERO ahí es donde, digo yo, entra en juego la función Page.Validate() y después la propiedad IsValid… ya que VOLVERÁ a validar la informacion que le llega contra el patrón RegEx… y el resultado SERÁ NEGATIVO con lo cual por esa parte ya estás protegido… supongo 😛

    De todas maneras, apasionante este post, me han parecido muy interesantes los dos enlaces a buayacorp.

    Saludos

  23. Hola:

    sobre el page.isvalid, sacado del reflector el codigo es este:

    _
    Public ReadOnly Property IsValid As Boolean
    Get
    If Not Me._validated Then
    Throw New HttpException(SR.GetString(“IsValid_Cant_Be_Called”))
    End If
    If (Not Me._validators Is Nothing) Then
    Dim validators As ValidatorCollection = Me.Validators
    Dim count As Integer = validators.Count
    Dim i As Integer
    For i = 0 To count – 1
    If Not validators.Item(i).IsValid Then
    Return False
    End If
    Next i
    End If
    Return True
    End Get
    End Property

    en ese ejemplo solo modifique el parametro, y por eso alli aunque acepto el dato salto la validacion.. ( en si no queria mostrar el modo para poner la validacion en true… ( por los riesgos que comente.. ) ….
    pero veamos si quieres poner el page.Isvalid en true. en el response aparecen codigo como este ( justo donde aparece la cadena de validacion).

    function WebForm_OnSubmit() {
    if (typeof(ValidatorOnSubmit) == “function” && ValidatorOnSubmit() == false) return false;
    return true;
    …..

    var Page_ValidationActive = false;
    …..

    function ValidatorOnSubmit() {
    if (Page_ValidationActive) {
    return ValidatorCommonOnSubmit();
    }
    else {
    return true;
    }
    }

    que crees que pasa si alli cambio unos false con true..? la pagina no solo enviara un dato cambiado, sino que ademas de eso… enviara al servidor el estado de validacion como “true”.. el page.isvalid, preguntara si el estado de validacion esta en true… y si es asi deja pasar la validacion…

    y con eso uno ya envio datos cambiados y ademas de eso hizo que el aspnet lo tome como datos validos…

    OJO que si intentamos enviar codigo malicioso como scripts o urls en vez de los parametos… nos manda al diablo ya que eso si es reconocido por el ASP.NET 🙂 .

    Pruebalo…., un truco para que el programa paros te funcione…., es que en proxy pongas localhost y el puerto 8080…, creas un directorio virtual en tu pc y pruebalo…. espero tus comentarios.

    Salu2

    Dacito 🙂

  24. gracias por tu respuesta, la vd se me hizo muy interesante tu post y mucho mas los comentarios posteriores. Alguno se confundio en el concepto que estabas planteando “Controles de Validacion <> Seguridad”

    Espero sigas posteando articulos igual de interesantes y consejos de Seguridad sobre ASP.Net desde lo mas basico a lo mas complejo

    Un saludo desde Orizaba, Ver. México 😉

  25. Whoau , me arde la vista de tanto leer jajaja, muy buen tema y al empezar a leer ,y aun cuando aclarabas que el tema no es para criticar la seguridad de ASP .net sino para mostrar buenas practicas de seguridad, los adoradores de microsoft se te van encima jajaja, no sabia lo que comentabas pero ahora que lo se lo tomare en cuenta y todo estuvo claro desde el principio me doy cuenta que ahora el problema es la comprension de lectura, parece que hay que pedirles que lean 2 veces tus posts para que al final terminen comprendiendolos saludos cordiales

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *