Como ativar a proteção de hotlink sem codificar meu domínio no arquivo de configuração do Apache?

4

Estamos navegando por uma solução há alguns dias.

Como faço para ativar a proteção de hotlink do Apache sem codificar meu domínio no arquivo de configuração para que eu possa portar o código para meus outros domínios sem ter que atualizar o arquivo de configuração toda vez?

Isso é o que eu tenho até agora:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.(com|net|org) [NC]
RewriteRule \.(gif|ico|jpe|jpeg|jpg|png)$ - [NC,F,L]

... E é isso que o Apache sugere:

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

... os quais codificam o domínio em suas regras.

O mais próximo que cheguei de encontrar alguma informação que cubra isso é aqui mesmo no ServerFault , mas a conclusão é que ele não pode ser feito. Com base em minha pesquisa, isso parece ser verdade, mas não encontrei nenhuma pergunta ou comentário dedicado apenas a essa questão.

Se alguém estiver curioso, aqui está o link para o Apache 2 docs que abordam este tópico.

Observe que as variáveis de ambiente do Apache (por exemplo, %{HTTP_REFERER} ) não podem ser usadas no argumento CondPattern do RewriteCond .

    
por Jeff 11.10.2012 / 15:29

1 resposta

2

Que tal verificar se o Host corresponde ao referenciador? Por exemplo,

RewriteCond %{HTTP_REFERER} !%{HTTP_HOST}

Editar

Isso não funcionará, conforme indicado pelo OP. Para o Apache 2.4, você pode usar:

RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"

Para o 2.2, você poderia escrever um pequeno manipulador em mod_perl ou mod_python que poderia realizar a comparação e emitir o erro 403.

Para conseguir isso com o mod_python:

Crie um arquivo no seu docroot (no meu caso / var / www /) chamado hotlink.py

from mod_python import apache

def headerparserhandler(req):
    if req.headers_in.get("Host") != req.headers_in.get("Referer"):
            return apache.HTTP_FORBIDDEN
    return apache.OK

Em sua configuração do Apache:

 <Directory /var/www/>
   ...
   AddHandler mod_python .jpg
   AddHandler mod_python .gif
   PythonHeaderParserHandler /var/www/hotlink.py
   #PythonDebug On
 </Directory>

Agora todos os pedidos de .jpg e .gif serão verificados pela primeira vez por hotlink.py. Com o mod_python, você também pode verificar o atributo req.server.server_hostname para verificar com ServerName em vez do cabeçalho do Host de entrada.

    
por 12.10.2012 / 00:51