Desenvolvimento - C#

Encriptando valores passados por QueryString

Nem sempre os valores que passamos por QueryString em nossas páginas são controlados da maneira que deveriam. Existem formas de melhorar essa abordagem utilizando encriptação.

por Rodolfo Paoni



Nem sempre os valores que passamos por QueryString em nossas páginas são controlados da maneira que deveriam. Existem formas de melhorar essa abordagem utilizando encriptação. É interessante utilizar nomes que não definiam claramente o que é passado naquele campo, por exemplo: "p", "p1", "p2", etc. Assim o usuário final não faz noção do que aquele valor representa e com a técnica de encriptação, isso fica ainda menos claro.

Abaixo demonstro uma classe com 2 métodos estáticos para realizar este trabalho:
public static class EncryptParam
{
    public static string Encrypt(string stringToEncrypt)
    {
        try
        {
            Byte[] b = System.Text.ASCIIEncoding.UTF8.GetBytes(stringToEncrypt);
            return Convert.ToBase64String(b);
        }
        catch
        {
            return string.Empty;
        }
    }

    public static string Decrypt(string stringToDecrypt)
    {
        try
        {
            Byte[] b = Convert.FromBase64String(stringToDecrypt);
            return System.Text.ASCIIEncoding.UTF8.GetString(b);
        }
        catch
        {
            return string.Empty;
        }
    }
}

Lembre-se: Os valores não estão critografados, apenas encriptados. Isso significa que ainda sim não existe total segurança, mas ao menos minimiza-se a vulnerabilidade do sistema com relação à QueryStrings.

Como recuperar e validar os parâmetros encriptados?
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
        // Validando o parâmetro "p"

            // Parâmetro não informado
        if (string.IsNullOrEmpty(Request.QueryString["p"]))
            {
                ClientScript.RegisterStartupScript(typeof(string), string.Empty,
              "window.alert(\"Parâmetro não informado.\");history.go(-1);", true);
            }
            // Parâmetro Inválido
            else if (EncryptParam.Decrypt(Request.QueryString["p"].Trim()).Equals(string.Empty))
            {
          ClientScript.RegisterStartupScript(typeof(string), string.Empty,
              "window.alert(\"Parâmetro inválido.\");history.go(-1);", true);
            }
            // Parâmetro válido
            else
            {
                // Decriptando o valor da Url
                Response.Write(EncryptParam.Decrypt(Request.QueryString["p"].Trim()));
            }
    }
}

Um abraço e bons códigos!
Rodolfo Paoni

Rodolfo Paoni - Rodolfo Paoni - Desenvolvedor .NET - Twitter: @rodolfopaoni