Como evitar links diretos ("roubo de imagem" / "roubo de largura de banda") de recursos no meu site?

8

Estou tentando escrever o htaccess anti-link "final" ...

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

Esses são os recursos que estou procurando:

  • É necessário bloquear o vínculo ativo para obter uma lista de extensões de arquivo quando HTTP_REFERER é um site estrangeiro.
  • Deve permitir a vinculação ativa para o domínio atual (duh) sem codificá-lo no .htaccess.
    • Para o domínio atual, ele deve funcionar em http e https.
    • Para o domínio atual, ele deve funcionar com www e sem www.
  • É necessário poder adicionar domínios de exceção a essas regras (como nosso amigo Google) e esses domínios devem funcionar em http e https e com www ou sem www.

Isto é o que eu 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 o código fixo mydomain.comno .htaccess? (Seria ótimo poder implantar esse .htaccess em todos os meus domínios sem precisar modificá-lo para cada um deles.)
  2. No meu RewriteRule, gif|jpe?g|png|zipx?é equivalente a gif|jpg|jpeg|png|zip|zipxcerto? (Desculpe ainda ser novo em expressões regulares.)
  3. Você vê algo ruim no meu acesso. Que eu não conheço?

Para o primeiro, eu 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 a minha pergunta # 1?

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

Atualizar:

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

AlexV
fonte
O IMHO Apache deve vir com este arquivo de configuração pelo menos como uma opção a ser incluída. Gostaria de saber se algum desenvolvedor do Apache estaria disposto a adicioná-lo se você / nós pudéssemos criar um?
22611 Chris Nava
5
Não. Aqui está o porquê - tomoconnor.eu/blogish/mod-rewrite-killing-social-media
Tom O'Connor
@ Tom O'Connor Leitura interessante e eu concordo com isso. Mas meu script no meu caso será usado para arquivos binários grandes (como zip, exe ...) e não para imagens e coisas do tipo. Então, eu ainda precisaria obter uma resposta. Sim largura de banda é barato, mas de 500 MB zip não é o mesmo que um 100 KB jpg ...
AlexV
Eu não estava esquivando uma resposta. Eu estava apenas reclamando;)
Tom O'Connor

Respostas:

9

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

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

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 outros referenciadores válidos com diretivas SetEnvIfe adicionais Allow.

voretaq7
fonte
Nada mal, mas preciso de uma solução que não codifique o nome de domínio no htaccess (leia minha pergunta com atenção).
AlexV #
Então você precisa de uma solução programática como Oliver proposta (que ainda requer que você codificar uma lista, expressão regular, ou alguma outra representação das referências permitidos - Ele apenas permite que você colocá-lo em um arquivo discreto)
voretaq7
Não necessariamente, se você olhar para o meu bloco de código 2 você pode ver isso pode ser feito ... Eu só preciso adaptá-lo para o meu caso ...
AlexV
Você pode usar a lógica de limpeza no seu segundo bloco de código (ou mágica semelhante apenas %{HTTP_HOST}para menos análise de regex) para inserir o host da URL no seu conjunto de regras, o que deve comprar domínios locais dinâmicos (teste extensivamente), mas você ainda precisará -Code "nice" referências externas, como Google (por referência, agente do usuário, IP, etc.)
voretaq7
3

Que tal escrever uma regra que, se o referenciador for desconhecido (proibido), basta chamar um arquivo Php onde você passa a imagem como um parâmetro e, no arquivo Php, basta colocar em vermelho grande: "esse arquivo vem do MYWEBSITE.COM e não tem autorização oficial para ser mostrada aqui ".

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

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

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

Na filter.phpcarga apenas dinamicamente uma lista de vhost ou algo parecido:

if (isset($_SERVER['HTTP_HOST'])) {
   if ((mb_ereg('thereferers\.I\.HATE\.com',HOST) !== false) ) {
       ... your code ...
   }
}
Olivier Pons
fonte
É uma possibilidade, mas não quero "desperdiçar" a CPU com isso (usando PHP). Eu só quero servir 403s. Também com o PHP, você precisa gerenciar todos os problemas de cache e isso pode ser bastante complexo.
AlexV
1

Cloudflare pode ser de alguma ajuda para você: http://www.cloudflare.com

No entanto, isso só funciona para imagens, mas parece ser o que você procura.

Proteção Hotlink

Ative automaticamente a proteção de hotlink para suas imagens para impedir a vinculação externa. Os referenciadores que não estão na 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: http://mydomain.com/images/pic.jpg Para ignorar: http://mydomain.com/images/hotlink-ok/pic.jpg

Pablo
fonte
0

questão 1:

RewriteEngine On
RewriteCond% {HTTP_REFERER}! ^ Http: // (. +)? Yoursite.com/ [NC]
RewriteCond% {HTTP_REFERER}! ^ $
RewriteRule. *. (Jpe? G | gif | bmp | png) $ - [F]

Questão 2:

sim

Questão 3

Eu usaria meu

gênese
fonte
Para a pergunta 1, "yoursite.com" é codificado permanentemente, portanto, não é útil.
AlexV
@ AlexV: Não é. Basta substituir yoursite.com com o endereço que você deseja permitir e outros referers vai deixar de baixar quaisquer imagens
Gênesis
E como me permito sem codificá-lo?
AlexV
-1

Ou use o CoralCDN e deixe o folk hotlink ao conteúdo de seus corações?

Tom Newton
fonte