Soluciones REALES a problemas REALES - Request y Response Encriptados

abril 28, 2009 14:30 by sergio

Quiero aprovechar para enviar un saludo a todos los miembros de la comunidad y para pedir una disculpa por esta ausencia tan larga que he tenido, por cuestiones laborales me ha sido complicado atender y compartir un poco de conocimiento.

En base a esto, he decidido comenzar a publicar soluciones REALES a problemas REALES con los que nos enfrentamos todos los días, ya estoy cansado de vagar por infinidad de sitios en donde no se dan SOLUCIONES a problemas cotidianos y en ocasiones PUERILES, pero que el desconocimiento de los mismos nos lleva a dolores de cabeza cuando los ambientes son PRODUCTIVOS con grandes volúmenes de transaccionalidad o cuando nos viciamos de dar una solución compleja a algo que no lo es. En este artículo vamos a ver un tema PUERIL, en el cual vamos a simular las clases del REQUEST y del RESPONSE, de tal forma que crearemos las nuestras y las mandemos llamar de forma tan natural que el uso es transparente pero encripta toda lo información contenida en el QueryString cuando la misma es muy sensible. 

1.     Primeramente vamos a crear un nuevo Sitio Web, en mi caso Visual Studio 2008, puede ser en cualquier versión del Framework, no estamos usando LINQ o alguna chuchería propia de la versión. 

2.     Vamos a crear 3 clases: MyRequest.cs, MyResponse.cs y MyEncriptor.cs, en esta ocasión voy a usar C#, no porque sea de los que están casados con algún lenguaje, sino que fue el primer lenguaje que me apareció en mi IDE cuando cree el proyecto. 

3.     Vamos a tirar código: 

MyResponse.cs 
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text.RegularExpressions; /// <summary>/// Clase que simula el Response pero de una URL encriptada/// </summary>public class MyResponse{    public static void Redirect(String url, Boolean endResponse)    {        var pagina = string.Empty; var query = string.Empty;        try        {            pagina = url.Split('?')[0].ToString();            query = url.Split('?')[1].ToString();            query += string.Format("?{0}", url.Split('?')[2].ToString());        }        catch (Exception ex)        {            Console.WriteLine(ex);        }        finally        {            System.Web.HttpContext.Current.Response.Redirect(pagina + "?" + MyEncriptor.Encriptar(query), endResponse);        }    }

}

Explicación: Se está creando una clase MyResponse, la cual contiene otra clase estática llamada Redirect, la cual recibe de parámetro la URL de destino y una variable boolena que indica el termino de la ejecución de la página (como se hace en el response tradicional). Lo que hace esta función es dividir la parte de la URL en cuestión del QueryString de la misma, una vez obtenidos estos valores por separado se hace una encripción del QueryString y se le concatena nuevamente a la URL, dado esto se hace el Redirect tradicional. 

System.Web.HttpContext.Current.Response.Redirect(pagina + "?" + MyEncriptor.Encriptar(query), endResponse);  

MyRequest.cs 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Text.RegularExpressions; /// <summary>/// Clase que simula el Request pero de una URL encriptada/// </summary>public class MyRequest{    public class QueryString    {        public static String Get(String variable)        {            var res = string.Empty;            string Url = string.Empty;            try            {                Url = MyEncriptor.Desencriptar(System.Web.HttpUtility.UrlDecode(System.Web.HttpContext.Current.Request.Url.Query.Remove(0, 1)));                Regex r = new Regex(variable + "=(?<key>(.*?))(&|$)");                res = r.Match(Url).Result("${key}");            }            catch (Exception ex)            {                res = string.Empty;            }            return res;        }    }}

Explicación: Se está creando una clase MyRequest, la cual contiene otra clase estática llamada QueryString y la cual a su vez contiene una función estática llamada Get, esta recibe de parámetro una variable de tipo String y regresa de la misma forma el resultado de la obtención de un value determinado del QueryString. Lo interesante en esta clase es que obtenemos el QueryString actual (Ya encriptado), lo desencriptamos y mediante el uso de una expresión regular obtenemos la ocurrencia a sabiendas de cómo se forma un QueryString.                

Url = MyEncriptor.Desencriptar(System.Web.HttpUtility.UrlDecode(System.Web.HttpContext.Current.Request.Url.Query.Remove(0, 1)));                Regex r = new Regex(variable + "=(?<key>(.*?))(&|$)");                res = r.Match(Url).Result("${key}"); 

Esto como resultado nos arroja el valor esperado oculto dentro del chorizo de caracteres raros e ilegibles del QueryString. Este sencillo ejemplo es muy útil cuando necesitamos enviar información entre páginas y no queremos que el usuario malintencionado la cambie para fregarnos la existencia y ahorrarnos validaciones en código en caso de que alteren los parámetros dentro de la misma. 

Anexo un .ZIP (http://cid-a57150b9cc22cc3a.skydrive.live.com/self.aspx/Articles/RequestSiteExample.zip) con el código fuente utilizada. Si se están preguntando porque no pongo el código de la clase de encripción es porque la misma es irrelevante a la solución y puede ser cualquier tipo de algoritmo que creemos conveniente para realizar la misma. En este caso de ejemplo yo estoy utilizando una implementación del algoritmo DES tradicional. 


En nuestra próxima entrega veremos: ¿QUIEN FREGADOS DIJO QUE NO SE PUEDE TRANSFORMAR CON XSLT 2.0 DENTRO DE NUESTRAS APLICACIONES .NET?


Actualmente calificado con 5.0 por 1 personas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Publicaciones relacionadas