Como evitar hot linking (“roubo de imagem” / “roubo de largura de banda”) de recursos no meu site?

8

Estou tentando escrever o ".htaccess" anti-hot links "ultimate".

Você pode encontrar muitos exemplos / tutoriais / geradores na rede, mas muitos deles estão errados ou incompletos (ou até mesmo ambos).

Estes são os recursos que estou procurando:

  • Deve-se bloquear o hot linking para uma lista de extensões de arquivo quando HTTP_REFERER é um site externo.
  • Deve permitir hot linking para o domínio atual (duh) sem codificá-lo no .htaccess.
    • Para o domínio atual, ele deve funcionar com http e https.
    • Para o domínio atual, ele deve funcionar com www e sem www.
  • Deve ser possível adicionar domínios de exceções a essas regras (como nosso amigo Google) e esses domínios devem funcionar com http e https e com www ou sem www.

Isso foi o que consegui até agora:

<IfModule mod_rewrite.c>

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?mydomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google.com/.*$ [NC]
RewriteRule \.(gif|jpe?g|png|zipx?)$ - [NC,F]

</IfModule>

Minhas perguntas:

  1. Como evitar codificar mydomain.com no .htaccess? (Seria ótimo poder implantar esse .htaccess em todos os meus domínios sem ter que modificá-lo para cada um deles.)
  2. Na minha RewriteRule, gif|jpe?g|png|zipx? é equivalente a gif|jpg|jpeg|png|zip|zipx , certo? (Desculpe ainda novo em expressões regulares.)
  3. Você vê alguma coisa ruim no meu .htaccess que eu não saiba?

Para o # 1, sei que é um pouco possível. O mais próximo que encontrei é esse trecho que remove o www da URL sem codificar o domínio. Existe uma maneira de usar esse método para minha pergunta # 1?

RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteCond %{HTTPS}s/%1 ^(on(s)|offs)/(.+)
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]

Atualização:

Estou ciente das soluções que servirão para uma imagem com marca d'água em vez da imagem normal. Mas eu não estou procurando por esse tipo de solução. Eu quero uma solução universal (servir 403 erros) que funcionará para todos os tipos de arquivos binários (zip, exe, iso, jpg, png, gif ...).

    
por AlexV 11.08.2011 / 15:26

5 respostas

9

Não importa o que você faça, você estará "desperdiçando" ciclos de CPU (para determinar se o site de referência (aquele que faz a vinculação) está autorizado ou não, você deve fazer algum processamento dos dados da solicitação). A única coisa que você pode fazer é economizar largura de banda enquanto desperdiça um mínimo de ciclos de CPU.

Existem alguns exemplos no Apache Docs que fazem exatamente o que você deseja. Este aqui:

SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
Order deny,allow
Deny from all
Allow from env=localreferer
</FilesMatch>

parece ser o mais aplicável (e não requer o peso total de mod_rewrite).
Você pode adicionar referenciadores válidos adicionais com as diretivas adicionais SetEnvIf e Allow .

    
por 15.08.2011 / 21:39
3

Que tal escrever uma regra que, se referer for desconhecida (de proibido), basta chamar um arquivo php onde você passa a imagem como um param, e no arquivo php, basta colocar em vermelho grande: "esse arquivo vem MYWEBSITE.COM e não tem autorização oficial para ser mostrado aqui ".

Quanto à sua pergunta, torne sua regra global. Corrija-me se estiver errado, mas se a regra for declarada antes , qualquer vhost será aplicado em todo o vhost (tipo de "regra padrão").

E outra ideia é simples: basta redirecionar para um arquivo Php (aqui filter.php ) que irá procurar no site autorizado e retornar o arquivo necessário se tudo estiver correto:

RewriteRule /(.*)\.jpg$ /filter.php?im=$2\.jpg [QSA,L]

Em filter.php apenas carregue dinamicamente uma lista de vhost ou algo parecido:

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}
    
por 12.08.2011 / 14:30
1

O Cloudflare pode ajudá-lo: link

No entanto, isso só funciona para imagens, mas parece que você está atrás delas.

Proteção contra Hotlink

Ative automaticamente a proteção por hotlink para suas imagens para impedir a vinculação externa. Referenciadores que não estão em zona e não estão em branco terão acesso negado. As extensões de arquivo suportadas são gif, ico, jpg, jpeg e png.

Protegido: link Para ignorar: link

    
por 15.08.2011 / 21:48
0

pergunta 1:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+)?yoursite.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*.(jpe?g|gif|bmp|png)$ - [F]

pergunta 2:

yes

pergunta 3

I'd use my one

    
por 20.08.2011 / 23:32
-1

Ou use o CoralCDN que permite que as pessoas façam links para o conteúdo do seu coração?

    
por 15.08.2011 / 21:51