Inicio  |  Código  |  Utilidades  |  Enlaces  |  Buscar  |   
Error processing SSI file
Info
Descarga
qse.zip (12Kb) 

Valid XHTML 1.0!

Valid CSS!

Módulo HTTP para encriptar automáticamente los query strings.

Este módulo http encripta y desencripta los query strings en forma transparente para el programador, sin necesidad, en la mayor parte de los casos, de programar especialmente ese comportamiento en las páginas.

¿Cómo se instala?

Los módulos http se pueden instalar a nivel de maquina o de aplicación. Para agregarlo a una aplicación web primero debemos copiarlo a la carpeta bin de la aplicación y luego registrarlo en el archivo web.config. La instalación al nivel de máquina (afecta a todas las aplicaciones del servidor) es similar pero se hace en el machine.config.

Copiar al portapapelesEjemplo de web.config con el módulo http
<configuration>
   <system.web>
      ...
      ...
      ...
      <httpModules>
         	<add type="Edanmo.Web.Security.QueryStringEncryptionModule,Edanmo.Web.QSE" 
              name="QSE" />
      </httpModules>
   </system.web>
</configuration>

También, si hace falta encriptar el string desde código (por ejemplo para hacer un Response.Redirect) puede agregarse la DLL a las referencias.

¿Cómo funciona?

Los módulos http (clases que implementan la interfase IHttpModule) funcionan como filtros. En cada acceso a una página de la aplicación se crea una instancia y se llama a su método Init con la instancia de la aplicación. Utilizando esa instancia desde el módulo se puede acceder a los eventos de esta según necesitemos. En este caso nos interesan dos eventos PreRequestHandlerExecute y PostRequestHandlerExecute.

Private Sub Init(ByVal context As System.Web.HttpApplication) Implements IHttpModule.Init

    ' Set the handler for the PreRequestHandlerExecute event
    AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute

    ' Set the handler for the PostRequestHandlerExecute event
    AddHandler context.PostRequestHandlerExecute, AddressOf OnPostRequestHandlerExecute

End Sub

El evento PreRequestHandlerExecute se lanza cuando el cliente requiere una página y antes de que el manejador de la página se ejecute.  PostRequestHandlerExecute se ejecuta luego de que el manejador de página se ejecuta y antes de que la respuesta se envíe al cliente.

El método OnPreRequestHandlerExecute

Este método es llamado en respuesta al evento PreRequestHandlerExecute. Lo se hace en el es extraer el string encriptado y desencriptarlo para que llegue desencriptado al código de la página. Para lograr esto lo que hacemos es modificar, usando Reflection, la propiedad IsReadOnly de la colección QueryString. De esta manera podemos modificarla para agregarle el query string desencriptado y eliminar el encriptado. Al finalizar, volvemos a poner QueryString como solo lectura para que desde la página esta tenga el comportamiento normal.

' Get the PropertyInfo for the NameValueCollection.IsReadOnly property
Dim isReadOnly As PropertyInfo = queryCollection.GetType.GetProperty("IsReadOnly", _
                                     BindingFlags.Instance Or BindingFlags.NonPublic)

' Set the query string collection to read/write
isReadOnly.SetValue(queryCollection, False, Nothing)

El método OnPostRequestHandlerExecute

OnPostRequestHandlerExecute maneja el evento PostRequestHandlerExecute y en el seteamos el filtro del stream de respuesta. El filtro del stream de respuesta permite capturar la salida de la página y modificarla antes de que llegue al cliente. Un punto importante aquí es ver que tipo de contenido es la respuesta, ya que no queremos modificar archivos binarios sino solo HTML.

' Get the application object
Dim app As HttpApplication = CType(sender, HttpApplication)

With app.Response

    ' Set the response filter stream if the
    ' content type is text/html
    If .ContentType.ToLower = "text/html" Then
        .Filter = New QueryStringEncryptionResponseFilter(.Filter)
    End If

End With

La clase QueryStringEncryptionResponseFilter

Esta clase es responsable de buscar query strings en la respuesta de la página para encriptarlos antes de que llegue al cliente. En el método Write recibimos la salida HTML de la página y usando expresiones regulares buscamos y reemplazamos los query string que se encuentren los tags (no se reemplazan aquellos que estén dentro de un script!). Una vez hecho el reemplazo se escribe en el stream base el resultado para que ASP.NET lo envie al cliente.

Public Overrides Sub Write(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer)

    ' Get the HTML from the buffer
    Dim html As String = UTF8.GetString(buffer, offset, count)

    ' Encrypt the query string in the action attribute of forms
    html = _regexForm.Replace(html, AddressOf QueryStringMatchEvaluator)

    ' Encrypt the query string in the src attributes
    html = _regexSrc.Replace(html, AddressOf QueryStringMatchEvaluator)

    ' Encrypt the query string in the href attributes
    html = _regexHRef.Replace(html, AddressOf QueryStringMatchEvaluator)

    ' Write the new response to the base stream
    Dim buffer2() As Byte = UTF8.GetBytes(html)
    _stream.Write(buffer2, 0, buffer2.Length)

End Sub