Conheça o HTTP Referer

Por Jean Hertel, 12/10/2016

http , paranoias

Olá leitores, hoje irei abordar um cabeçalho HTTP bastante comum nos navegadores, mas que possuí pouco ou nenhum uso prático. O nome do cabeçalho é Referer.

#O que é?

O HTTP Referer é um cabeçalho HTTP que é enviado junto de suas requisições web. Ele basicamente serve para identificar de onde está vindo a requisição anterior.

#Para que serve?

A primeira aplicação é utilizá-lo para identificar de onde vem o trafego de determinado website. Várias ferramentas de análise de trafego fazem uso deste cabeçalho como parte de seu algoritmo de identificação. Pode-se utilizá-lo, por exemplo, para saber quais blogs estão direcionando para este determinado website.

Uma outra aplicação mais útil para o referer é checagem de segurança. Pode-se verificar o cabeçalho e através das informações que ele contém permitir, por exemplo, apenas downloads das imagens do website se o cabeçalho conter a URL do próprio website ou seja, dele mesmo. Ou ainda se a requisição veio de determinado buscador. Da mesma forma, é possível verificar se o cabeçalho está presente ao receber requisições POST, aumentando assim a segurança dos formulários.

#Como usuário, porque não utilizá-lo?

O referer pode ser facilmente utilizado para rastrear suas atividades na web. Outro problema em potencial é o consumo desnecessário de banda. Se o cabeçalho não é obrigatório, porque enviá-lo? Você não irá ganhar nada enviando um cabeçalho “inútil”. Talvez em plataformas fixas como computadores em rede local isto seja irrelevante, porém quando utilizam-se plataformas mobiles, onde a rede geralmente é bastante cara, vale a pena economizar cada bit possível.

#Como programador, porque não utilizá-lo?

Imagine um cenário onde exista um blog “A” que faz várias postagens de imagens. O blog “B” por sua vez copia o conteúdo na integra, mas ao invés de hospedar as imagens, ele utiliza o link original do servidor do blog “A”. Agora além de perder tráfego, gasta-se mais com rede. É possível mitigar este problema checando pelo referer do usuário, de modo a bloquear o download de imagens se o referer for um valor diferente do blog “A” ou se for de um motor de busca. Pronto! Problema resolvido!?

Não tão rápido! O que acontece se os usuários do blog “A” estiverem com o referer bloqueado? Eles não verão as imagens. Pode-se orientá-los a sempre ter o referer ligado, mas e se eles estiverem navegando através de um proxy (como o Squid por exemplo), que tem a opção de remover o cabeçalho? Neste caso não há como garantir uma checagem segura do cabeçalho.

#Ok você me convenceu, como eu removo o referer?

No Firefox (testado com a versão 25 até 48) pode-se ir em “about:config” e procurar pela variável “network.http.sendRefererHeader”. O valor 2 indica sempre enviar, enquanto o valor 1 indica que irá enviar somente para uma requisição completa, não enviando em requisições de imagens por exemplo. Já o valor 0 (zero) indica desligado, ou seja, nunca será enviado o cabeçalho. Procure também pela variável “network.http.sendSecureXSiteReferrer” e mude ela para false. Assim quando navegar de um site HTTPS para outro o cabeçalho não será enviado. Por default a opção é true, indicando que será enviado.

No Google Chrome não há opções nativas para desabilitar isto. É possível desabilitar a opção se você compilar o código a partir do fonte. Há ainda a possibilidade de desabilitar utilizando extensões, mas isto não é 100% garantido.

No Opera pode-se ir em Configurações > Preferências > Avançado > Network e desmarcar o box “Send referrer information”.

No Internet Explorer não é possível localizar uma opção que desabilite o envio. Pesquisando sobre o assunto você provavelmente chegará à seguinte página: aqui que diz basicamente que: O suporte à esta opção não existe.

#Conclusões

Utilizo o navegador com este cabeçalho desabilitado desde o início de 2014, sendo que pouquissimos sites apresentaram problemas. Na programação também é bem plausível parar de utilizá-lo uma vez que não há como garantir o valor do cabeçalho.

Nota: Segundo a RFC 2616 seções 14.36, 15.1.2 e 15.1.3, um cabeçalho HTTP referer é opcional.