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.