Chalalo Land

Tecnologías ASP.NET y un poco Más

Contacto


 Si quierer cooperar, yo feliz, muy agradecido :)

De donde me Visitan?

Locations of visitors to this page

Generic Content

Si te gustaron los articulos, y te animas te estaría muy agradecido!


Recent Posts

Tags

Community

Blogs de MVP

Amigos Geeks

Blogs Imperdibles

GODS

Archives

Email Notifications

[Tips] ASP.NET 4 – Extensible Request Validation, con ejemplo.

Hola!, seguimos revisando las nuevas características de ASP.NET 4, el cual introduce la característica de que nos customizar la lógica de validación de los request de nuestra sitio.

Como ya saben las validaciones de  ASP.NET sobre los request  HTTP entrantes son analizadas en busca de posibles ataques XSS, en el caso que se encuentre algún elemento sospecho en la cadena , se devuelve un error. Intentos anterior para asegurar que nada se filtre, finalmente resultan en demasiados falsos positivos, por ejemplo cuando queremos utilizar algún WebEditor HTML, y lo que hacemos muchas veces es es desactivar la validación con el ValidateRequest="false" y con esto nos ponemos en riesgo, aca mi chiste favorito sobre el tema:

[exploits_of_a_mom.png]

Para extender la validación de los  request de nuestro sitio, podemos crear una clase que herede  desde el nuevo tipo System.Web.Util.RequestValidator , y configuramos nuestra aplicación agregando en el web.config la sección httpRuntime, haciendo referencia a la clase que hemos creado.(puedes crear más clases de validación y las puedes ir separando por comas)

<httpRuntime requestValidationType="CustomRequestValidation"/>

 

Ahora veamos la clase y vamos a validar que las entradas no contengan el carácter “#”

Imports Microsoft.VisualBasic
Imports System.Web.Util
Imports System.Runtime.InteropServices

Public Class CustomRequestValidation
    Inherits RequestValidator

    Dim caracterInvalido As String = "#"
    Protected Overrides Function _
       IsValidRequestString(ByVal context As HttpContext, _
        ByVal value As String,
        ByVal requestValidationSource As RequestValidationSource, _
        ByVal collectionKey As String, _
        <OutAttribute()> ByRef validationFailureIndex As Integer) As Boolean

       
If requestValidationSource.Form Then
            If value.Contains(caracterInvalido) Then Return False
        End If
        Return True
    End Function
End Class

Entonces si revisamos este pequeño ejemplo, vamos a ver que tiene varios parámetros de entrada:

context
Tipo: System.Web.HttpContext
El contexto del request actual

value
Tipo: System.String
El valor del HTTP request a validar

requestValidationSource
Tipo: System.Web.Util.RequestValidationSource
Es una enumeración que representa el origen del request que se va a validar, hay varios por cada postback, lo puedes comprobar, los posibles valores son:

  • QueryString
  • Form
  • Cookies
  • Files
  • RawUrl
  • Path
  • PathInfo
  • Headers

collectionKey
Tipo: System.String
La clave en la colección de ítems para validar. Es un parámetro opcional.

validationFailureIndex
Tipo: System.Int32%
Cuando este método retorna, indica la posición dentro del texto en donde se produce el problema.Este parámetro se pasa sin inicializar.

En nuestro UI vamos a tener:

image

Al ejecutar y hacer un break en el momento de presionar el botón , el cual genera Postback vamos ver las variables:

image

Obviamente no es lo único que se evalúa, también, como veíamos en el parámetro requestValidationSource

image

 

Al momento de ingresar un signo # en el textbox vamos se va a levantar la Exception con la información del collectionKey y el value

image

Ahora bien,  este es una primera aproximación para que vayamos entendiendo las nuevas características, luego veremos un ejemplo más completo.
Espero que esto te sirva :)

Saludos
Gonzalo

Posted: 2/4/2010 4:38 por Gonzalo Perez | con 3 comment(s)
Archivado en: ,,
Comparte este post:

Comentarios

TomPier ha opinado:

great post as usual!

# May 7, 2010 7:28 PM

Jortx ha opinado:

Gracias por la implementación en VB. Había encontrado varios ejemplos en C# y no lograba traducir correctamente por culta del OutputParameter. Gracias a tu código ya compila.. y funciona!

Pero le sigo viendo el mismo problema.

Con versiones anteriores de Framework, era posible saltarse la validación para una sola página.

En este caso, parece que se indica en el Web.Config, y es obligatorio que todas las páginas del sitio sean validadas a través de nuestro CustomValidator.

¿Hay alguna forma de decirle al site que utilice nuestro CustomValidator en una sola página, manteniendo el resto de páginas con la validación por defecto?

Muchas gracias por tu ayuda.

Saludos cordiales.

# July 7, 2010 6:58 PM

nudier ha opinado:

muy buen metodo.

# October 29, 2010 8:13 AM