MCPD 70-547: Validacion de data

Para que voy a poner validación, si mi aplicación no la va a visitar mucha gente“. “Ya ves, para que usas ASP.NET, yo te dije que te iban a salir esas pantallas amarillas“.


Y aquí, continuando con la serie MCPD. Hablar sobre los controles login en ASP.NET, estaría demás, hay 229,000 artículos sobre esto. Así que vamos a centrarnos en algunos detalles; y para saber como nos afecta el no usar validación a la seguridad, podemos leer al maligno, para darse cuenta, de las travesuras que hace la gente cuando esta ociosa 😀, de todos los peligros a los que esta expuesta una Aplicación Web.


Si no han visto los controles de validación de ASP.NET, les recomiendo darse una vuelta por aquí: Validation Controls, incluye documentación, ejemplos online, y el código de los ejemplos.


Como se sabe, siempre se recomienda hacer las validaciones del lado del cliente, si estas en el registro de un usuario y necesitas validar que el rango de edades esta entre el 18 y 30, no es necesario irse al servidor para validar eso, es suficiente con hacerlo del lado del cliente; agregando un control RangeValidator, lo asociamos a nuestros controles, le damos el rango de valores, el tipo de datos, y el se encargará de hacer el render necesario para generar el JavaScript que valida del lado del cliente el rango deseado. Pero hay momentos en que necesariamente tienes que hacer validaciones contra una base de datos, o contra valores en el web.config, por ejemplo tienes un campo para ingresar el número de documento de una persona, pero dependiendo del tipo de persona el número de dígitos varía.


Uno de los grandes controles de validación, es el control RegularExpressionValidator, que viene con algunas expresiones regulares para validar correo, dirección web, entro otros, y si queremos otras expresiones podemos visitar http://regexlib.com/, un gran repositorio de expresiones regulares. Pero lo interesante es poder usar expresiones regulares con valores de una base de datos, o de un archivo de configuración:



   1: if (!Page.IsPostBack)
   2: {
   3:    string nroDigitos = ConfigurationManager.AppSettings[“nroDni”];
   4:    RegularExpressionValidator1.ValidationExpression = 
   5:          string.Format(@”d{{{0}}}”, nroDigitos);
   6: }

Y con esto ya podemos explotar mucho mas al control RegularExpressionValitor. Notar que para formar el string estamos usando tres “{“, lo que pasa es que queremos usar a la llave “{” como operador para reemplazar un valor, pero además lo queremos usar como carácter “{“, y debido a eso debemos colocar “{{“, para indicar esa diferencia.


Digamos que ya tenemos validación en nuestra Aplicación Web, pero como sabe el usuario que debe colocar 8 dígitos o 6 dígitos, de alguna manera se debe proveer asistencia al usuario, hay que tratar en lo menos posible que tenga que consultar al administrador por una feature, y tratar de que la aplicación sea lo más intuitiva posible. Por ejemplo en un formulario, podemos sólo colocar asteriscos a los costados de las cajas de texto, pero el usuario no será adivino de saber que sólo se permite edades entre 20 y 28, el control ValidationSummary, nos ayudará a completar esta tarea.


Y con validaciones o no, siempre por ahí se puede escapar un muertito :D, es fácil echarle la culpa a Microsoft de los bonitas pantallas amarillas que a veces encontramos en la web. Para evitar esto, recuerden que podemos usar el elemento CustomErrors, para tener mensajes de error personalizados:



   1: <customErrors mode=”On” defaultRedirect=”Error.htm”>
   2:         <error statusCode=”403″ redirect=”NoAccess.htm” />
   3:         <error statusCode=”404″ redirect=”FileNotFound.htm” />
   4: </customErrors>


Bueno ya le di al usuario un mensaje más amigable, y no le mostré información que lo puede confundir, o que pueda afectar la seguridad de nuestra aplicación web. Pero, el admin o el webMaster como sabe que hubo error?, o que error fue?:



   1: void Application_Error(object sender, EventArgs e) 
   2: { 
   3:    // Code that runs when an unhandled error occurs
   4:    Exception ex = Server.GetLastError().GetBaseException();
   5:  
   6:    System.Diagnostics.EventLog.WriteEntry(
   7:         “Geeks.ms – Demos”,
   8:         “Hombre, que aquí esta tu error: ” + ex.ToString(),
   9:         System.Diagnostics.EventLogEntryType.Error);             
  10:  
  11: }

Pues nos vamos al archivo Global.asx, el que maneja los eventos de la aplicación, y con el código de arriba, ya tendremos en el EventLog los errores de nuestra aplicación:



Hay muchas otras opciones para registrar los errores, podemos también insertarlo a una base datos, u otra fuente de información que nosotros deseemos, existen algunas clases con esta funcionalidad, o también aplications bloks:



Algunos otros artículos sobre el manejo de errores:



Y por cierto, puedes descargar el código del ejemplo en el link de abajo :).


P.D.: Como dice el libro “Writing Secure Code“, el único capítulo que leí, “all input is evil, until proven otherwise”.


Saludos,


Post cruzado

8 comentarios en “MCPD 70-547: Validacion de data”

  1. No debes hacer las validaciones solamente en cliente pues es trivial saltarselas. Los ValidationControls generan la validación en client, para cortar los casos erróneos rápidamente PERO también se ejecutan en servidor, SIEMPRE, para realmente realizar la validación de forma segura.

    Muy potentes los ValidationControls, sí señor 🙂

  2. Sería ideal que puedas rectificar tu idea de seguridad con este post de mi amigo DDAZ, ya que los controles de Validación no tienen nada que ver con Aplicaciones SEGURAS, y no debiéramos caer en comentarios como el que escuché alguna vez en un DevDays acerca de que Seguridad es NO darle la clave de tu correo a tus amigos, o no dejar tu PC desprotejida, que pena en verdad, este mundo es de locos, con razón tenemos muchos detractores de Microsoft.

    http://geeks.ms/blogs/ddaz/archive/2008/02/02/controles-de-validaci-243-n-191-son-realmente-seguros.aspx

    Hasta pronto.

  3. Después de leer el post del Ddaz, pienso igual, pienso creo que deberia corregirse la idea de seguridad del que se habla en este post.

    “ERRAR ES DE HUMANOS Y CORREGIR ES DE SABIOS” y como predica el slogan “y conocerás la verdad y la verdad te hará libre”.

    Un saludo,
    PercyReyes,

  4. :O :O :O!

    Hola Cristiam y Percy!. Un gusto leerlos por acá :D. Pues en mi post solamente uso dos veces la palabra seguridad, y sólo una vez con referencia a la validación (no a los controles de validación), es más hablo de seguridad para referenciar al malgino: http://elladodelmal.blogspot.com/.

    Lo que si debi dejar claro es que controles de validación no es igual a seguridad como dijo el dacito, hay que colocar también validación del lado servidor. Justamente por eso cite al maligno, para que conoscan todos los diversos tipos de ataques que podría recibir nuestra aplicación, y esta entrada no pretendía ser la top de seguridad. Pudiendo tener una primera conclusión que sólo con controles de validación no son garantía para tener una aplicación segura.

    Pero hablando de seguridad la validación en general, es una parte, también esta el tema de permisos, entre otros temas, hombre si quieres aprender más sobre seguridad visita el blog del maligno: http://elladodelmal.blogspot.com/.

    Por último:
    – Cristiam es cierto lo que mencionas los controles de validación no es lo mimos que aplicaciones web seguras, pero no encuentro dentro de mi post donde mencione que colocando los controles de validación tu aplicación esta recontra segura :S.
    – Percy podrías citar la frase en la que transmito una idea erronea de la seguridad?, y el por que entendiste eso?

    P.D.: No se olviden de leer el post del Dacito, se puso interesante :D, sobre todo los comentarios.

    Saludos,

  5. Por cierto Cristiam, basado en los proyectos que llevas cargados en estos años, sería bueno un post sobre “seguridad” en las aplicaciones Web, que medidas has usado y que técnicas, creo que hay mucho que aprender en la experiencia que ya llevas …, Percy tu también puedes tocar ataques que puede haber a una base de datos basado en todas las lecturas que has hecho…

    Creo que la seguridad es todo un tema… y siempre cada un tiene algo que contar ya sea por la experiencia en proyectos o por la lectura continua… pero los mas beneficiados son la comunidad….

    nos leemos.

    Saludos,

  6. Hola Sergio, gracias por la invitación a postear estaré atendiendo tu pedido con mucho gusto, al igual que las cosas que otras amistades me han venido solicitando, entre ellos Dacito.

    Saludos.

  7. Hola Sergio,

    Entonces pronto tendremos post sobre ataques a base de datos…

    Gracias,

    P.D.: Feliz dia de la amistad!!! (por adelantado, por si me olvido, ya que ando volaoo…)
    saludos,

Deja un comentario

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