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!