← Tutoriais

[APACHE] Uma Protecção Contra HotLinking Que Realmente Funciona

Lida 8494 vezes

Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

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:
Código: [Seleccione]
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.

Código: [Seleccione]
/
/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.

Código: [Seleccione]
/
/.htaccess
/teste.html
/imagens/.htaccess
/imagens/fotografia.jpeg

No .htaccess que fica na raiz da pasta pública, colocamos o seguinte:

Código: [Seleccione]
# ////// 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:
Código: [Seleccione]
# ////// 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.
Offline

LuyZ 
Membro
Mensagens 10 Gostos 0
Troféus totais: 17
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary

 :)
Muita BoM :D
Obrigado por compartilhares :p
 :obrigado:
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Ainda bem que gostaste LuyZ. :)

De facto o htaccess traz-nos imensas possibilidades idênticas a esta.

Eu por exemplo para além de usar nalguns sites para as imagens, uso também em podcasts, portanto este é um bom ponto de partida para proteger qualquer ficheiro e não apenas imagens, basta usar a imaginação ;)
Offline

LuyZ 
Membro
Mensagens 10 Gostos 0
Troféus totais: 17
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Level 3 Level 2 Level 1 10 Posts First Post Karma Eighth year Anniversary

Ainda bem que gostaste LuyZ. :)

De facto o htaccess traz-nos imensas possibilidades idênticas a esta.

Eu por exemplo para além de usar nalguns sites para as imagens, uso também em podcasts, portanto este é um bom ponto de partida para proteger qualquer ficheiro e não apenas imagens, basta usar a imaginação ;)
Toh a ver que sim my friend :)
Sabes se ah alguma maneira de bloquear ips pelo htaccess depois de determinado uso de trafego, tipo que desse uma especie de ban no ip e depois de algumas horas que eu pretende-se o ip poderia voltar a visitar o site ? ( Exemplo um ip que gasta-se 500mb so poderia entrar no site daqui a uma hora depois de ter gasto os 500mb )

MUITO :obrigado:  :)

Cumps,
LuyZ
Offline

Bernaagr 
Membro
Mensagens 81 Gostos 0
Feedback +7

Troféus totais: 18
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 3 Level 2 Level 1 50 Posts 10 Posts First Post

Muito obrigado pela partilha
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Toh a ver que sim my friend :)
Sabes se ah alguma maneira de bloquear ips pelo htaccess depois de determinado uso de trafego, tipo que desse uma especie de ban no ip e depois de algumas horas que eu pretende-se o ip poderia voltar a visitar o site ? ( Exemplo um ip que gasta-se 500mb so poderia entrar no site daqui a uma hora depois de ter gasto os 500mb )

MUITO :obrigado:  :)

Cumps,
LuyZ

Apenas por htaccess não consegues fazer isso. Mas se for para usar em download de ficheiros facilmente o fazes com php, o que pode dar um pouco mais de trabalho é desenvolver o método de forma a que seja inviolável, ou pelo menos mais difícil de fazer batota.



Muito obrigado pela partilha

De nada, espero que seja útil. :)