Redirecionando usuários que vieram do Referer errado

1

Ignorando os méritos de se devemos ou não fazer essa mudança (as circunstâncias são um pouco complexas e provavelmente cobertas pelo meu NDA), nosso cliente gostaria que exigíssemos que os visitantes do site que estamos construindo viessem de outro seus sites. Se um usuário nos procurar de outro lugar, ele deve ser enviado para a tela de login desse outro site.

Parece que a maneira mais fácil de fazer isso é usar mod_rewrite para redirecionar qualquer coisa com um referenciador que não é nem nosso site nem este outro.

Meu pensamento atual é

Em httpd.conf

RewriteMap deflector txt:/path/to/deflector.map
RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} =NOT-FOUND
RewriteRule ^ http://www.theothersite.com/login.jsp [R=307,L]

Em deflector.map

//www.oursite.com/ -
//oursite.com/ -
//www.theothersite.com/ -
//theothersite.com/ -

Isso nos permitiria expandir a lista de "referenciadores permitidos" com bastante facilidade, o que parece uma boa ideia.

Eu tenho três perguntas então:

  1. O mod_rewrite (que já estamos usando extensivamente) é a melhor maneira de fazer isso?
  2. Se for, então a resposta 307 Temporary Redirect é a melhor maneira de lidar com isso?
  3. Como eu não sou principalmente um LAMP dev / admin, eu fiz algum erro de digitação nessas regras de reescrita? o)

Sinto que 307 Temporary Redirect ou 403 Forbidden são os códigos de status e presumo que seja A Bad Thing ™ para enviar um cabeçalho de redirecionamento Location: com uma resposta 4xx .

Isso tudo faz sentido?

Edit: Por padrão, as pesquisas de mapa são sensíveis? Preciso me preocupar com o caso aqui?
Editar 2: As pesquisas de mapa são uma pesquisa regex ou uma correspondência de chave inteira? Se o mapa contiver www.foo.com e o Referer: ler http://www.foo.com/bar.php , ele corresponderá?

    
por Owen Blacker 19.01.2012 / 14:49

2 respostas

0

O que acabamos fazendo é o seguinte:

RewriteCond %{REMOTE_HOST} !A.B.C.(D|E)
RewriteCond %{HTTP_HOST}==%{HTTP_REFERER} !^(.*?)==https?:/// [NC]
RewriteCond %{HTTP_REFERER} !https?://referring.domain.com/ [NC]
RewriteRule ^ https://referring.domain.com/path/to/login/script [R,L]

O primeiro RewriteCond (e várias outras linhas como ele) significa que os desenvolvedores e o cliente não estão restritos por essa verificação (como é realmente cansativo ter que ir até lá antes de ir ao nosso site).

O segundo RewriteCond é um trabalho genial para verificar se o referenciador é igual ao Host: no pedido. Isso se baseia no > answer to SO # 7398191: Verificação genérica do referenciador mod_rewrite - porque mod_rewrite só faz interpolação variável na string de teste, você não pode ter uma leitura de linha

RewriteCond %{HTTP_HOST} !^https?://%{HTTP_REFERER}/ [NC]

porque simplesmente não faz essa verificação.

Aparentemente, "nunca" precisaremos permitir outros referenciadores. Se o fizéssemos, acho que eu teria que definir essa última RewriteCond line para terminar [NC,OR] e encadear algumas outras condições.

Tudo funcionando bem. Obrigado pela sua ajuda, todos!

    
por 27.02.2012 / 19:19
2

Acho que o mapa faz distinção entre maiúsculas e minúsculas e também é necessário extrair o nome do host do Referer . Eu não testei nada, mas algo assim talvez funcione:

RewriteMap deflector txt:/path/to/deflector.map
RewriteMap lc int:tolower
RewriteCond %{HTTP_REFERER} ^https?://([^:/?]+)
RewriteCond ${lc:%1} (.+)
RewriteCond ${deflector:%1|NOT-FOUND} =NOT-FOUND
RewriteRule ^ http://example.com/ [L]

Não se preocupe com códigos de resposta incomuns; o padrão de 302 é bom.

    
por 19.01.2012 / 18:11