1. Introdução
Cookie , ou cookie HTTP, cookie da web, cookie do navegador é um pequeno dado enviado do site e armazenado no navegador do usuário quando ele navega neste site. Cada vez que um usuário carrega um site, o navegador envia automaticamente cookies ao servidor web para notificar o site sobre as ações anteriores do usuário.
Os cookies são projetados para serem um mecanismo confiável que ajuda os sites a lembrar informações de status (como itens no carrinho de compras) ou armazenar atividades do usuário (incluindo cliques), um link, login, páginas visitadas durante a semana, mês ou ano,... ).
Embora os cookies não possam transportar vírus, nem instalar malware no seu computador, o uso de cookies de rastreamento e principalmente de terceiros é considerado uma forma de identificar informações pessoais do histórico de navegação dos usuários. Os cookies podem salvar senhas ou conteúdo que os usuários inserem em formulários HTML, como números de cartão de crédito ou endereços pessoais.
Quando um utilizador visita um site pela primeira vez, um cookie é enviado do servidor web para o navegador e armazenado no seu computador. Então, quando ele retornar ao site, o site irá reconhecê-lo pelas informações salvas no cookie.
Cookies de autenticação são um método comum usado para determinar se um usuário está conectado a um site ou não. Sem esse mecanismo, será difícil para o site saber quando enviar informações pessoais ao usuário e forçar o usuário a fazer login várias vezes. Os cookies de autenticação, embora muito convenientes, criam oportunidades para os hackers lerem dados sensíveis nos cookies, realizando assim ações que prejudicam os utilizadores.
2. Visão geral dos cookies HTTP
2.1. História
O termo cookie é derivado do termo cookie mágico, que é um dado imutável enviado e recebido por um programa de computador. Um programador chamado Lou Montuli teve a ideia de usar cookies mágicos em comunicações na web em 1994. Naquela época, ele trabalhava para a Netscape Communications, em um projeto de desenvolvimento de aplicativos de comércio eletrônico para a MCI. Os cookies têm sido utilizados como solução na construção de carrinhos de compras virtuais, ajudando os servidores da MCI a não terem que salvar o status das transações, mas sim armazená-los no computador do usuário.
Juntamente com John Giannandrea, Montuli escreveu a primeira especificação para cookies Netscape. A versão 0.0beta do Mosaic Netscape, lançada em 13 de outubro de 1994, suportava cookies. A primeira utilização de cookies (fora do laboratório) verificou se um cliente que visitava o site da Netscape já o havia visitado antes ou não. Montuli obteve uma patente de cookie em 1995. E a versão 2 do Internet Explorer (lançada em outubro de 1995) incorporou o uso de cookies.
A introdução de cookies não foi generalizada nesta época. Em particular, os cookies são aceites por defeito, os utilizadores não são notificados da sua presença. O público só tomou conhecimento da existência de cookies depois de um artigo sobre eles no Financial Times ter sido publicado em 12 de fevereiro de 1996. Desde então, os cookies têm recebido muita atenção, especialmente as informações privadas neles contidas. Os cookies foram discutidos em duas audiências da Comissão Federal de Comércio dos EUA em 1996 e 1997.
A primeira discussão sobre uma especificação formal de cookie começou em abril de 1995. Um grupo especial dentro da Internet Engineering Task Force (IETF) foi formado com o propósito de realizar este trabalho. Finalmente, a especificação foi publicada pelo grupo em fevereiro de 1997. A especificação definia cookies de terceiros como não aceitáveis para todos ou, pelo menos, não habilitados por padrão.
Em abril de 2011, a especificação padrão para cookies em uso prático foi publicada no documento RFC 6265 .
2.2. Terminologia
Cookies de sessão
Os cookies de sessão, também chamados de cookies de memória ou cookies transitórios, só existem na memória temporária enquanto o utilizador navega no site. Se uma data de expiração ou intervalo de validade não for definido no momento da criação do cookie, um cookie de sessão será definido. Normalmente, os navegadores da web excluem automaticamente os cookies de sessão quando o usuário fecha o navegador.
Cookies persistentes
Os cookies persistentes prolongam a sessão do usuário. Se um cookie persistente for definido como Max-Age de 1 ano, durante esse período, o valor inicial definido no cookie será enviado ao servidor cada vez que o usuário visitar o site. Ele pode ser usado para registrar informações importantes, como a primeira vez que o usuário visitou o site. Por esta razão, os cookies persistentes também são chamados de cookies de rastreamento.
Cookies seguros
Cookie seguro é um atributo de segurança habilitado ao usar HTTPS, garantindo que o cookie seja sempre criptografado quando transferido do cliente para o servidor, evitando espionagem e revelação de informações. Além disso, todos os cookies devem cumprir a política de mesma origem do navegador.
Cookies somente HTTP
O atributo HttpOnly dos cookies é suportado pela maioria dos navegadores. Um cookie de sessão HttpOnly será usado apenas em uma solicitação HTTP (ou HTTPS), limitando assim o acesso por APIs não HTTP, como Javascript. Essa restrição atenua, mas não elimina o roubo de cookies por meio de vulnerabilidades de script entre sites (XSS).
Cookies de terceiros
Cookies primários são cookies pertencentes ao mesmo domínio (ou subdomínios dentro do mesmo domínio) exibidos na barra de endereço do navegador. Cookies de terceiros são cookies pertencentes a diferentes domínios exibidos na barra de endereços do navegador. Os sites podem ter conteúdo de domínios de terceiros (como banners), a partir dos quais o histórico de navegação dos usuários pode ser rastreado. As configurações de privacidade da maioria dos navegadores bloqueiam cookies de rastreamento de terceiros.
Por exemplo, suponha que um usuário visite o site example1.com . Este site contém um anúncio de ad.foxytracking.com. Quando carregado, os cookies de ad.foxytracking.com serão salvos. Ele então visita outro site (example2.com), que também contém um anúncio de ad.foxytracking.com, e também define um cookie pertencente a ad.foxytracking.com. Por fim, ambos os cookies serão enviados ao anunciante ao carregar anúncios ou acessar seu site. Os anunciantes podem usar esses cookies para criar o histórico de navegação do usuário em todos os sites que contêm seus anúncios.
Em 2014, havia alguns sites que definiam cookies que podiam ser lidos por mais de 100 domínios de terceiros. Em média, um site terá cerca de 10 cookies configurados, com um número máximo de cookies superior a 800.
Superbiscoito
Um supercookie é um cookie originado de um domínio de nível superior, como .com, ou de um sufixo público, como .co.uk. É importante que os supercookies sejam bloqueados pelos navegadores devido a alguns problemas de segurança. Se desbloqueado, um invasor que controla um site malicioso pode configurar um supercookie para personificar as solicitações do usuário, enviando solicitações para outros sites que compartilham o mesmo domínio de nível superior ou sufixo público. Por exemplo, um supercookie originário do domínio .com pode prejudicar as solicitações para exemplo.com, mesmo que o cookie não tenha origem em exemplo.com. Ele pode ser explorado para falsificar logins ou alterar informações do usuário.
Biscoitos zumbi
Cookies zumbis são cookies que são recriados automaticamente após o usuário excluí-los. Isso é feito por um script que armazena o conteúdo do cookie em outro local, como um armazenamento de conteúdo Flash, um armazenamento HTML5 ou algum outro mecanismo do lado do cliente.
2.3. Estrutura de cookies
Um cookie com tamanho de 4 KB inclui 7 componentes principais:
- Nome
- Valor
- Expira (data de validade)
- Caminho (caminho para onde o cookie é válido, “/” significa que o cookie é válido em qualquer caminho)
- Domínio
- Seguro
- Somente http
Os primeiros dois componentes (nome e valor) são obrigatórios.
2.4. Usar
Gerenciamento de sessão
Os cookies podem ser usados para manter dados relacionados ao usuário em múltiplas visitas ao site. Os cookies são uma solução para a criação de um carrinho de compras, um carrinho de compras virtual que ajuda o utilizador a guardar os artigos que escolhe enquanto navega pelos produtos.
Os aplicativos atuais de carrinho de compras geralmente armazenam a lista de itens do carrinho no banco de dados do servidor, em vez de armazená-la em um cookie do lado do cliente. O servidor web normalmente enviará um cookie contendo o identificador da sessão - ID da sessão (que é único). O navegador retornará esse ID de sessão com a solicitação de compra de cada usuário.
Permitir que os usuários façam login em sites é outra aplicação dos cookies. Normalmente, durante o primeiro login, o servidor web enviará ao cliente um cookie contendo o ID da sessão. Os usuários enviarão suas informações e o aplicativo da web autenticará a sessão e permitirá que o usuário use seus serviços.
Os cookies fornecem um mecanismo de interação cliente/servidor rápido e conveniente. Uma das vantagens dos cookies é que armazenam informações do usuário em um arquivo localizado no computador do usuário. Isso reduz significativamente o espaço de armazenamento e o tempo de processamento do servidor.
Personalizado
Os cookies podem ser usados para lembrar as informações pessoais de um usuário quando ele visita um site, para exibir conteúdo mais relevante para esse usuário cada vez que ele visita o site novamente.
Um exemplo proeminente é o recurso de recomendação de livros da amazon.com. Quando um usuário clica em um livro, a Amazon faz sugestões sobre os próximos livros que o usuário deve conferir. Essas sugestões baseiam-se nos livros que os usuários navegaram anteriormente e nos livros que escolheram comprar.
Outro exemplo é o recurso de sugestão de pesquisa da Pesquisa Google. Ao fazer login com sua conta pessoal e realizar uma pesquisa, o Google fornecerá sugestões “só para você”, e os resultados desejados sempre aparecerão no topo da lista.
Monitor
Os cookies de rastreamento podem ser usados para rastrear o histórico de navegação de um usuário. Isso também pode ser feito usando o endereço IP do computador que envia a solicitação ao site ou contando com o campo Referrer do cabeçalho da solicitação HTTP, mas os cookies fornecem mais precisão. Isto se faz do seguinte modo:
- Se um usuário visitar um site, mas esta solicitação não contiver um cookie, o servidor assumirá que esta é a primeira vez que o usuário visita este site; O servidor irá gerar uma string aleatória e enviá-la como um cookie de volta ao navegador junto com a página da web solicitada.
- A partir deste ponto, o cookie será enviado automaticamente pelo navegador ao servidor sempre que for solicitada uma nova página web neste site, o servidor retornará a página solicitada normalmente, mas com o URL dessa página web e o tempo. O acesso será salvo em um arquivo de log. Ao analisar as informações salvas neste arquivo de log, o histórico de navegação da pessoa, os sites visitados com frequência e os hábitos de navegação serão revelados.
2.5. Implantação

Cookies são dados enviados do servidor para o navegador. O navegador irá então enviá-lo de volta ao servidor sem alterar o conteúdo interno, cada vez que o usuário enviar uma solicitação ao site. Os cookies também podem ser definidos por uma linguagem de script, como Javascript.
Cada navegador da web pode armazenar pelo menos 300 cookies em um arquivo de 4 KB e pelo menos 20 cookies por servidor ou domínio.
Configurar cookies
O servidor web e o navegador se comunicam via HTTP (HyperText Transfer Protocol). Por exemplo, para acessar a página http://www.example.org/index.html, o navegador se conecta ao servidor enviando uma solicitação HTTP como esta:
![Web11: Cookies HTTP e alguns problemas de segurança Web11: Cookies HTTP e alguns problemas de segurança]()
O servidor responderá enviando ao navegador um pacote de texto simples, denominado resposta HTTP. Este pacote pode conter uma linha contendo o conteúdo do cookie:
![Web11: Cookies HTTP e alguns problemas de segurança Web11: Cookies HTTP e alguns problemas de segurança]()
Set-Cookie é um campo que instrui o navegador a armazenar o cookie e enviá-lo ao servidor futuramente sempre que houver uma solicitação ao servidor (se o cookie ainda estiver expirado). Por exemplo, o navegador envia uma solicitação para http://www.example.org/spec.html enviando uma solicitação HTTP como esta:
![Web11: Cookies HTTP e alguns problemas de segurança Web11: Cookies HTTP e alguns problemas de segurança]()
Esta é uma solicitação para outra página pertencente ao mesmo servidor. Neste caso, o servidor entenderá que esta solicitação está relacionada à solicitação anterior e responderá enviando ao navegador a página solicitada, possivelmente adicionando outros valores de cookie.
O valor do cookie pode ser modificado pelo servidor enviando o campo Set-Cookie: name=value na resposta HTTP para o navegador. O navegador substituirá então o valor antigo do cookie por este novo valor.
O valor do cookie pode incluir qualquer caractere ASCII imprimível, exceto “,”, “;” e espaço em branco. Os nomes dos cookies também não podem conter o caractere '=', pois é o caractere que separa o nome e o valor.
O termo cookie fragmento às vezes é usado para se referir ao par nome-valor de um cookie.
Os cookies também podem ser definidos por Javascript ou uma linguagem de script semelhante. Em Javascript, o objeto document.cookie é usado para definir cookies. O atributo HttpOnly é responsável por impedir que scripts ruins leiam o conteúdo do cookie.
Propriedades dos cookies
Além do par nome-valor, o servidor também pode definir uma série de outras propriedades do cookie: Domínio, Caminho, Expiridade, Idade Máxima, Seguro e HttpOnly. O navegador não enviará esses atributos ao servidor, apenas enviará o par nome-valor. Esses atributos são usados pelo navegador para determinar quando excluir cookies, bloquear cookies ou enviar cookies ao servidor.
Domínio e caminho
Domínio e caminho determinam o escopo do cookie. Eles permitem que o navegador determine quando enviar cookies ao servidor. Se não forem especificados, eles assumem como padrão o domínio e o caminho do objeto solicitado. No entanto, há uma diferença entre um cookie definido para foo.com sem o atributo de domínio e um conjunto de cookies com o atributo de domínio foo.com. No primeiro caso, o cookie só será enviado quando houver uma solicitação ao foo.com. Neste último caso, o cookie será enviado para todos os subdomínios de foo.com. A seguir está um exemplo de uma diretiva Set-Cookie de um site após o login do usuário, a partir de uma solicitação para docs.foo.com:
![Web11: Cookies HTTP e alguns problemas de segurança Web11: Cookies HTTP e alguns problemas de segurança]()
O primeiro cookie LSID não possui um atributo de domínio e possui o caminho /accounts. O navegador só enviará cookies quando a página solicitada estiver contida em docs.foo.com/accounts. Os dois cookies restantes, HSID e SSID, são enviados de volta ao servidor se houver uma solicitação para qualquer subdomínio de foo.com.
Os cookies também podem ser definidos apenas para o domínio principal e seus subdomínios. A configuração de cookies em www.foo.com a partir de www.bar.com não será permitida por razões de segurança.
Expira e Idade Máxima
O atributo Expires informa ao navegador quando excluir o cookie. A data em Expira é assim: “Wdy, DD Mon YYYY HH:MM:SS GMT”. Max-Age também é usado para indicar a data de expiração de um cookie. Vamos considerar o seguinte exemplo:
![Web11: Cookies HTTP e alguns problemas de segurança Web11: Cookies HTTP e alguns problemas de segurança]()
O primeiro cookie está definido para expirar em 15 de janeiro de 2013 e será usado pelo navegador quando expirar. O segundo cookie made_write_conn não expira e é usado como cookie de sessão, será excluído quando o navegador for desligado. O terceiro cookie reg_fb_gate, tem uma data de expiração no passado, será excluído imediatamente.
Seguro e somente HTTP
As propriedades Secure e HttpOnly são nulas; em vez disso, sua presença indica que as bases Secure e HttpOnly estão aplicadas.
O atributo Secure mantém a transmissão de cookies dentro de uma conexão criptografada. Se o servidor web definir um cookie com o atributo seguro a partir de uma conexão não segura, o cookie ainda poderá ser interceptado por um ataque man-in-the-middle.
O atributo HttpOnly instrui o navegador a não expor cookies através de uma conexão diferente de HTTP (ou HTTPS), como Javascript, e portanto dificulta a obtenção de cookies ao explorar vulnerabilidades de Cross-Site Scripting (XSS).
3. Alguns problemas de segurança ao usar cookies
Se um site usar o ID de sessão para identificar a sessão de um usuário, um invasor poderá roubar o cookie para se passar pelo usuário. Aqui estão alguns cenários comuns de roubo de cookies:
Escuta
![Web11: Cookies HTTP e alguns problemas de segurança Web11: Cookies HTTP e alguns problemas de segurança]()
O tráfego em uma rede pode ser interceptado e lido por terceiros (além do destinatário e do remetente). Este tráfego inclui cookies. Se a transmissão não for criptografada, um invasor poderá ler as informações confidenciais contidas no cookie. E aproveitando essas informações, os invasores irão se passar por usuários para realizar ações perigosas, como transações bancárias.
Este problema pode ser resolvido usando um protocolo seguro entre o computador do usuário e o servidor - o protocolo HTTPS. O servidor pode usar o sinalizador Seguro ao definir cookies. O cookie só será enviado através de um canal criptografado, como uma conexão SSL.
Scripting entre sites
![Web11: Cookies HTTP e alguns problemas de segurança Web11: Cookies HTTP e alguns problemas de segurança]()
Linguagens de script, como Javascript, podem ler valores de cookies e enviá-los para servidores arbitrários.
Suponha que um site tenha um erro de script entre sites, os hackers podem inserir códigos maliciosos, como o seguinte:
![Web11: Cookies HTTP e alguns problemas de segurança Web11: Cookies HTTP e alguns problemas de segurança]()
Quando a vítima clicar no link acima, o navegador executará o script no atributo onclick: enviando o cookie da vítima para o servidor attacker.com.
O cross-site scripting é uma das vulnerabilidades comuns dos sites (classificado em terceiro lugar entre as 10 vulnerabilidades mais comuns em 2013 - de acordo com o OWASP).
O risco desta vulnerabilidade pode ser limitado definindo o sinalizador HttpOnly para cookies. Nesse momento, os cookies não serão acessados por linguagens de script.
Falsificação de solicitação entre sites
CSRF (Cross-site request forgery) ou ataque de um clique, é um método de explorar vulnerabilidades de sites por meio do qual comandos não autorizados são executados pelas vítimas – usuários autorizados pelo site sem o seu conhecimento.
O CSRF enganará o navegador da vítima para que envie solicitações http para aplicativos da web. Caso a sessão da vítima não tenha expirado, as solicitações acima serão feitas com os direitos de autenticação da vítima.
Por exemplo, a vítima Bob está realizando transações no site de um determinado banco X. Fred é o atacante, esse cara sabe como funciona o site do banco X quando quer transferir dinheiro da conta A para a conta B da seguinte forma:
http://bank.example.com/withdraw?account=accountA&amount=100&for=accountB
Ele enviará a Bob uma mensagem maliciosa.
Se o banco X armazenar informações de autenticação do usuário em um cookie e Bob clicar no link acima, o dinheiro de Bob será transferido para Fred.
Para limitar esse risco, os parâmetros Expires podem ser definidos para cookies.
4. Conclusão
Os cookies são usados na maioria das aplicações web atualmente. Também contém riscos potenciais que afetam significativamente os utilizadores. Portanto, do lado do desenvolvedor, precisamos entender claramente os cookies e saber definir os parâmetros necessários para que a aplicação fique mais segura contra ataques de hackers.