Apache 2: Referer do host atual

1

Eu tenho um Apache 2 com mod_setenvif. Meu objetivo é parar todo o hotlinking de imagens no meu global apache.conf . Atualmente isso é:

<FilesMatch ".(gif|jpg|jpeg|png)$">
    SetEnvIfNoCase Referer "^http://[^/]*blogger.com/" hotlink
    SetEnvIfNoCase Referer "^http://[^/]*myspace.com/" hotlink
    SetEnvIfNoCase Referer "^http://[^/]*ebay" hotlink
    ...
    deny from env=hotlink
</FilesMatch>

Funciona muito bem até agora, mas eu tenho que pegar todos os hotlinkers uma vez e adicioná-los à minha configuração. Gostaria de ter uma ideia mais abrangente, adicionando algo assim:

    # Set variable "hotlink" if Referer contains "forum"
    SetEnvIfNoCase Referer "forum" hotlink

    # Unset variable if Referer is from the same Host as current request
    SetEnvIfNoCase Referer %{Host} !hotlink

O plano é combinar link evilhost .com / forum / , mas não link myhost .com / forum / .

O problema é que o último não definido não funciona. Parece que eu não posso usar a propriedade de cabeçalho "Host" como padrão regexp - pelo menos não do jeito que eu tentei. É claro que eu poderia inserir manualmente todos os possíveis nomes de host na minha configuração, mas é exatamente isso que eu quero evitar.

Então, minha pergunta é:

  • Existe uma maneira de usar um cabeçalho HTTP como padrão regexp?
  • Se não, você sabe de outra maneira que eu poderia alcançar meu objetivo de remover a variável "hotlink" se o referenciador for do mesmo host?
por BlaM 17.12.2009 / 13:27

3 respostas

1

(Isso começou como um comentário, mas ficou muito longo ...)

Suas imagens estão realmente sendo acessadas por vários nomes de host locais diferentes? Porque na maioria dos sites que eu mantenho, qualquer host virtual individual é tipicamente associado a talvez dois nomes de host (geralmente algo como example.com e www.example.com). Tem certeza de que não está tentando resolver um problema que não existe?

Você poderia fazer o que quiser usando mod_rewrite em vez de FilesMatch (porque você pode usar %{HTTP_HOST} em sua sequência de correspondência, o que significa que não precisa mais se preocupar em inserir todos os nomes de host locais). Uma simples pesquisa no google gera muitos nomes de host locais diferentes? Porque na maioria dos sites que eu mantenho, qualquer host virtual individual é tipicamente associado a talvez dois nomes de host (geralmente algo como example.com e www.example.com). Tem certeza de que não está tentando resolver um problema que não existe?

Você poderia fazer o que quiser usando mod_rewrite em vez de FilesMatch (porque você pode usar% {HTTP_HOST} na sua sequência de correspondência, o que significa que não precisa mais se preocupar em inserir todos os nomes de host locais). Uma simples pesquisa no google rende este site , que entra em mais detalhes sobre o uso de RewriteRule's para bloquear hotlinking.

    
por 19.12.2009 / 19:22
1

Você pode bloquear dinamicamente o hotlinking fazendo algo como:

RewriteCond "%{HTTP_HOST}_%{HTTP_REFERER}" !\.?([^\.]+\.[^\.]+?)_https?://.*/.*$ [NC]
RewriteRule .(gif|jpg|jpeg|png)$ . [F,L]
    
por 23.01.2010 / 00:02
0

Fora do topo da minha cabeça (por exemplo, eu ainda não pensei nisso), por que você não inverte sua lógica?

<FilesMatch ".(gif|jpg|jpeg|png)$">
    SetEnvIfNoCase Referer "^http://[^/]evilhost.com/" localref

    Order deny,allow
    deny from all
    allow from env=localref
</FilesMatch>
    
por 17.12.2009 / 17:15