Apache 2: Impedir hotlinking de imagem em todo o servidor

3

Estou tentando bloquear o acesso a imagens no meu servidor se elas estiverem vinculadas a partir de alguns "vilões" comuns, por exemplo, sites com usuários que tendem a usar a largura de banda de outras pessoas:

  • livejounal.com
  • blogger.com
  • myspace.com
  • ...

Há duas coisas que diferenciam minha pergunta de outras, como esta questão e essa pergunta :

  • Eu quero fazer isso "em todo o servidor", ou seja, configurado em apache.conf para todos os hosts / domínios, não em .htaccess ou hosts virtuais individuais
  • Eu quero redirecionar o pedido para uma imagem de minha escolha, e não apenas enviar um 403 FORBIDDEN

Eu tentei incluir o RewriteRules no apache.conf, mas ele não faz nada. E não parece haver uma opção que me permita redirecionar dependendo do SetEnv.

Alguma sugestão?

    
por BlaM 03.06.2009 / 16:04

4 respostas

2

Eu tenho uma solução, mesmo que não seja muito bonita, porque ela deixa o documento do erro padrão 403 alterado mesmo que a imagem não esteja com hotlink:

Isso vai para o apache2.conf:

    SetEnvIfNoCase Referer "livejournal.com" hotlink

    <FilesMatch ".(gif|jpg|jpeg|png)$">
            ErrorDocument 403 /server404/no_hotlink.php
    </FilesMatch>
    <FilesMatch ".(gif|jpg|jpeg|png|mpg|avi|flv)$">
            deny from env=hotlink
    </FilesMatch>

    Alias /server404 "/var/www/_404"
    <Directory "/var/www/_404">
        AllowOverride AuthConfig
        Order allow,deny
        Allow from all
    </Directory>

Usamos o caminho / server404 para um documento de erro 404 em todo o servidor por algum tempo, então já tivemos isso. Você também pode chamá-lo 403 ou GlobalNoHotlink ou o que você quiser.

Para imagens (primeiro FilesMatch), definimos o ErrorDocument "proibido" para um arquivo PHP em nosso diretório / server404. Em seguida, verificamos se ele é hotlinked (também fazemos isso para arquivos de vídeo, portanto, duas tags FilesMatch) e proibimos o acesso se hotlinked.

Isso entra em /var/www/_404/no_hotlink.php - o arquivo PHP chamado imagem proibida:

    <?PHP
    $file = dirname(__FILE__) . '/_default/no_hotlink.png';

    header('HTTP/1.1 200 OK', true, 200);
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");
    header('Content-length: ' . filesize($file));
    header('Content-type: image/png');
    readfile($file);
    ?>
  • A primeira linha é usada para identificar o arquivo de imagem que queremos enviar.
  • Em seguida, definimos o cabeçalho HTTP para 200 (isso é opcional. Decida você mesmo)
  • adicione alguns cabeçalhos para evitar o armazenamento em cache da imagem (não queremos que esse arquivo de pixel rosa de 8000x8000 apareça "do cache" em nosso site se a pessoa decidir ir ao nosso site, não é?)
  • Tamanho do conteúdo de acordo com o tamanho do arquivo fictício e
  • tipo MIME (talvez seja necessário alterar o último de não usar PNG).
  • Depois, lemos o arquivo.

Funciona - mas não é tão bonito quanto eu gostaria de tê-lo, então ainda será feliz com outras soluções.

    
por 03.06.2009 / 17:08
0

Eu tenho algo parecido com isso no meu httpd.conf:

RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "%{HTTP_REFERER}" "!^http://www.mydomain.com/.*$" [NC]
RewriteRule "\.(jpg|png)$ - [F]

Você pode precisar usar isso também se não tiver usado RewriteConds e RewriteRules antes:

RewriteEngine On

Encontrei-o no Google ou no Apache Cookbook. Não me lembro mais.

    
por 03.06.2009 / 17:18
-1

A única maneira eficaz de fazer isso é com as regras de modificação de reescrita. Se o referenciador não for de seu próprio domínio, reescreva o URL da imagem como um que não seja existente, em outro lugar ou um gif transparente de 1 por 1 px.

Muitas pessoas fazem isso com uma imagem que diz "Sem gritar, amigo" ou similar

    
por 03.06.2009 / 16:57
-1

a verificação de referência nem sempre funciona, alguns proxies ou até mesmo navegadores retiram o cabeçalho HTTP_REFERER de solicitações http.

é muito melhor verificar alguns cookies em seu código gerador de conteúdo [por exemplo, index.php que gera galeria de imagens] e verificar o nível mod-rewrite ou apache2 se o cookie estiver configurado para o valor esperado.

procure aqui ou aqui .

    
por 03.06.2009 / 17:21