[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]](http://2.bp.blogspot.com/_isk1o8_XWYA/R0ML6q6-HYI/AAAAAAAAAtY/_bm0dffd6Gc/s1600/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:
Al ejecutar y hacer un break en el momento de presionar el botón , el cual genera Postback vamos ver las variables:
Obviamente no es lo único que se evalúa, también, como veíamos en el parámetro requestValidationSource
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
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