Olá a todos!
Esta é uma das questões que continua a preocupar algumas pessoas, principalmente aquelas que possuem tráfego limitado nas suas contas de alojamento (
bandwidth).
Já todos se questionaram de como se proteger de terceiros que "
linkam" directamente para as nossas imagens, mas a resposta é sempre a mesma, algo deste género:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?dominio\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|png)$ /imagens/nohotlink.gif [L]
Sim, esta regra no
htaccess podia ser perfeita, pois o seu objectivo é negar o acesso directo de outros sites às tuas imagens. A variável
HTTP_REFERER verifica de onde vimos e apresenta a imagem se estivermos dentro do nosso site, mas redirecciona para outra imagem caso alguém esteja a fazer
hotlinking.
A verdade é que isto NÃO FUNCIONA, não da maneira que
realmente queremos!
Por dois motivos:
1º) Muitas pessoas
não enviam a variável
HTTP_REFERER, seja devido ao sistema de segurança ou se como eu seleccionam nas configurações do navegador web para não enviar, nomeadamente eu uso
Opera (vocês também deviam usar) onde é muito fácil configurar isso. No código de cima, a imagem vai continuar a ser apresentada quando a variável
HTTP_REFERER é omitida.
2º) Ao redireccionarmos para uma imagem alojada no nosso servidor, continuamos a
gastar largura de banda e a
enviar um pedido ao servidor apache.
Não serve de grande ajuda, pois não?
Agora se realmente queremos proteger-nos contra
hotlinking esta não é a forma correcta, isso eu sempre soube e várias vezes o disse aqui no +T, o que não disse foi que era impossível e é isso que vos venho explicar hoje.
O "truque" é usarmos um
cookie especial para validar-mos os pedidos e vamos fazê-lo usando apenas o
htaccess.
Mas antes quero esclarecer os
contras, sim porque este sistema
não é assim tão infalível e tem uma falha: caso o navegador não aceite
cookies, as imagens não vão aparecer, mesmo que abertas dentro do site.
Mas qual é o utilizador regular que hoje em dia desliga os
cookies? Fora alguns casos pontuais ninguém o faz, praticamente precisamos de cookies para fazer o
login em qualquer site e sim, para os mais conhecedores nestas andanças da programação é perfeitamente possível um sistema de login sem
cookies, mas estou a falar em casos generalizados. Eu próprio fiz alguns sistemas de
login sem usar
cookies e não estou a referir-me às sessões, pois estas também usam
cookies...
Voltando ao que realmente interessa, vou como exemplo, usar uma pasta chamada imagens, que será a pasta onde teremos as imagens que queremos proteger. Na raiz terei um ficheiro HTML, normalíssimo e dentro da pasta imagens coloco uma imagem.
/
/teste.html
/imagens/fotografia.jpeg
Claro, cada um terá depois de adaptar ao seu caso específico, mas penso que depois deste tutorial será bastante fácil fazê-lo.
A isto vamos
adicionar 2 ficheiros .htaccess, um na pasta imagens e outro na pasta de raiz.
/
/.htaccess
/teste.html
/imagens/.htaccess
/imagens/fotografia.jpeg
No
.htaccess que fica na
raiz da pasta pública, colocamos o seguinte:
# ////// Protecção Contra HotLinking (cc) IceBurn 2009 //////
<IfModule mod_headers.c>
# Indicar o dominio! Exemplos:
# - dominio.com
# - .dominio.com (funciona também para os subdominios)
Header set Set-Cookie: "pchl=1; path=/; domain=dominio.com"
</IfModule>
# \\\\\\ Protecção Contra HotLinking (cc) IceBurn 2009 \\\\\\
É importante colocarem o vosso domínio na linha respectiva, se eu quisesse por exemplo proteger dominio.com colocaria:
Header set Set-Cookie: "pchl=1; path=/; domain=
dominio.com"
No entanto vamos imaginar que eu queria proteger forum.dominio.com e loja.dominio.com por exemplo, aí já colocaria:
Header set Set-Cookie: "pchl=1; path=/; domain=
.dominio.com"
Isso é a indicação de onde o nosso cookie será válido.
No segundo
.htaccess, o localizado
na pasta imagens, colocaremos o seguinte:
# ////// Protecção Contra HotLinking (cc) IceBurn 2009 //////
<IfModule mod_headers.c>
<FilesMatch "\.(gif|jpe?g|png)$">
# -- Imagens em cache não gastam recursos do servidor.
Header set Cache-Control "public"
Header set Expires "Thu, 15 Apr 2020 20:00:00 GMT"
Header unset Last-Modified
# -- O mais importante; verificar se o cookie existe, ou redireccionar o pedido.
RewriteEngine on
RewriteCond %{HTTP_COOKIE} !^.*pchl.*$
RewriteRule .* http://i35.tinypic.com/2q39650.gif [L]
</FilesMatch>
</IfModule>
# \\\\\\ Protecção Contra HotLinking (cc) IceBurn 2009 \\\\\\
Reparem que eu usei uma imagem alternativa alojada num outro servidor que não o meu, esta:
Essa será a imagem que será apresentada quando forem vítimas de hotlinking, mas podem ser criativos...
Notem também que coloquei a imagem em cache, se a imagem estiver em cache não há um pedido ao servidor, logo não estamos a gastar recursos, no entanto isso é opcional.
Agora acedam ao ficheiro HTML, e tentem depois aceder à imagem na pasta imagens. Depois apaguem os cookies e tentem aceder novamente à imagem. Na primeira situação, a imagem é acessível, na segunda, depois de apagarem os cookies e não acederem à página HTML, a imagem que vão obter vai ser a que coloquei em cima.
E pronto, este é o método em que eu confio para um sistema de protecção de imagens básico e que gaste poucos recursos. Espero que seja do vosso agrado.
Requisitos: - Servidor Apache
Testado em Apache 2.2 com Opera.
Nota para os mais curiosos: o nome que escolhi para o cookie (pchl) são as iniciais de protecção contra hotlinking.