Artigo

Criptografando parâmetros na Query String URL

Olá pessoal, meu nome é Mauricio Junior e hoje eu vou falar e mostrar como criptografar parâmetros para passar pela URL e o usuário não consegue ver os dados passados pela URL. Um ponto importante aqui é, os desenvolvedores estão passando parâmetros pela URL que podem ser alterados facilmente e o usuário já entende isso, dados que podem ser alterados pela URL e muitos tem usado para invadir ou ver outras contas sem que tenha permissão por exemplo.

O que foi utilizado:

  • Editor: Microsoft Visual Studio
  • Linguagem C#
  • Tipo de projeto: Web
  • Framework: .NETCore
  • Package: NuGet CriptQuery

Problema

Usar url de forma aberta e qualquer um pode alterar os dados enviados ou acessar dados que nĂŁo podem ser acessados.

Solução

Utilizar um NuGet Package que criptografa os parâmetros da URL query string e o usuário não consegue alterar os parâmetros. Se forem alterados, os dados serão inválidos e assim você protege os dados.

Vamos ver na prática como utilizar isso usando apenas poucas linhas de código. O pacote NuGet está disponível gratuitamente no site da Microsoft e no meu site mauriciojunior.net/nugets onde você pode fazer download gratuitamente para usar em seus projetos. Esse pacote eu fiz para ajudar os desenvolvedores de software como eu sempre gosto de fazer.

Eu vou para o cĂłdigo agora

O primeiro passo Ă© instalar o pacote no seu projeto, pode ser web ou console sem nenhum problema. Veja a figura 1.

image

Figura 1 - Instalando NuGet no projeto

Eu abri o NuGet clicando com o botão direito do mouse em cima de Dependences. No browse existe a opção de pesquisar e eu pesquisei por criptquery ou se você colocar meu nome Mauricio Junior já consegue achar todos os pacotes lá.

Agora basta fazer o importe e digitar duas linhas no código. Na página Index.cshtml.cs eu fiz o importe usando using, veja o código 1.

CĂłdigo 1 - Fazendo o importe

using CriptQuery;

No método OnGet eu crei uma instância para colocar os parâmetros que eu preciso e depois fiz um redirect para a página privacy onde eu vou pegar as informações passadas pela URL.

Veja o código 2 mostrando como eu fiz no OnGet método.

Código 2 - OnGet método

public void OnGet()
{
	var sec = new SecureQueryString();
	sec["emailSitemauriciojunior.net"] = "teste@mail.com";

	Response.Redirect($"/Privacy/?id={sec.ToString()}");
}

O primeiro ponto aqui foi gerar uma instância de SecureQueryString() e o segundo ponto foi gerar uma informação qualquer com os valores que eu quiser, nesse caso sec["emailSitemauriciojunior"] com o valor teste@mail.com.

Eu posso gerar aqui quantos valores eu quiser e quantos parâmetros eu precisar.

A terceira linha do código foi apenas redirecionar para outra página passando os parâmetros que eu desejo, nesse caso ?id={sec.ToString()}.

A figura 2 mostra como ficou a url criptografada.

Image

Figura 2 - Passando os dados

Se você fizer junto comigo, que é o que eu indico, verá o tanto que ficou criptografada a informação.

Para pegar a informação e retirar a criptografia, é necessário passar o parâmetro para a nova instância dos dados. Na página Privacy.cshtml.cs e no método OnGet eu fiz algumas verificações para poder pegar os dados e fazer o que eu preciso com eles. Veja o código 3.

Código 3 - Pegando os dados na página Privacy.

public void OnGet()
{
	if (string.IsNullOrEmpty(Request.Query["id"]))
		Response.Redirect("Index");

	var _id = Request.Query["id"];

	if (string.IsNullOrEmpty(_id))
		Response.Redirect("Index");

	var sec = new SecureQueryString(_id);
	var email = sec["emailSitemauriciojunior.net"];

	Console.WriteLine(email);
}

O primeiro passo foi verificar se algum dado é passado com o nome id. Se nada estiver como id, a página será redirecionada para a página inicial chamada Index.

O segundo passo é atribuir o valor a uma variável chamada _id. Se nada tiver dentro dela, também é redirecionado para a página principal.

No terceiro passo eu crio uma instância de SecureQueryString passando o parâmetro _id e depois basta pegar o valor dentro do parâmetro que criei inicialmente na primeira página, o sec["emailSitemauriciojunior.net"].

Assim eu consigo pegar exatamente o valor sem a criptografia e de forma segura. VocĂŞ pode ver na figura 3 o resultado na parte final.

Image

Figura 3 - Resultado final

Se houver algum problema na decriptografia dos dados ou se o usuário tentar mudar alguma coisa na querystring a criptografia não vai acontecer e volta um erro que pode ser tratado usando try e catch. Assim eu posso tratar o erro e evitar que qualquer dado seja mudado facilmente por um usuário ou pessoa com más intenções.

Espero que tenha gostado e qualquer dĂşvida pode me encontrar na rede social Instagram @mauriciojunior_net ou pelo meu site www.mauriciojunior.net.

  • Mauricio Junior

    Mauricio Junior