1 votes

Rediriger les utilisateurs qui proviennent d'un mauvais référent

Sans tenir compte de la question de savoir si nous devons effectuer ce changement ou non (les circonstances sont légèrement complexes et probablement couvertes par mon accord de confidentialité), notre client souhaite que nous exigions que les visiteurs du site que nous construisons proviennent d'un autre de ses sites. Si un utilisateur nous arrive d'un autre site, il doit être dirigé vers l'écran de connexion de cet autre site.

Il semble que le moyen le plus simple de le faire soit d'utiliser mod_rewrite pour rediriger tout ce qui a un référent qui n'est ni notre site ni cet autre.

Ma réflexion actuelle est la suivante

Sur 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]

Sur deflector.map

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

Cela nous permettrait d'étendre la liste des "référents autorisés" assez facilement, ce qui semble être une bonne idée.

J'ai donc trois questions :

  1. Est mod_rewrite (que nous utilisons déjà abondamment) la meilleure façon de procéder ?
  2. Si c'est le cas, alors c'est un 307 Temporary Redirect réponse la meilleure façon de le gérer ?
  3. Comme je ne suis pas principalement un développeur / administrateur LAMP, ai-je fait des fautes de frappe stupides dans ces règles de réécriture ? ;o)

J'ai l'impression que 307 Temporary Redirect o 403 Forbidden sont les plus appropriées codes de statut et je suppose que c'est A Bad Thing™ d'envoyer un Location: avec un en-tête de redirection 4xx réponse.

Tout ça a un sens ?

Editar: Est-ce que les recherches de cartes sont des cas- sur sensible par défaut ? Dois-je me préoccuper de la casse ici ?
Edit 2 : Les recherches de cartes sont-elles une recherche regex ou une correspondance de clé entière ? Si la carte contient www.foo.com y el Referer: L'en-tête se lit comme suit http://www.foo.com/bar.php Est-ce que ça correspondra ?

0 votes

Pensez à ce qui va se passer ici lorsqu'un navigateur ne renvoie pas un référent. De plus, vous ne pouvez pas envoyer une réponse de localisation avec un code d'état 4xx.

0 votes

@symcbean Ouais, c'est pour ça que j'ai RewriteCond %{HTTP_REFERER} !="" là d'abord. Et merci, je ne pensais pas que je pouvais envoyer une Location: avec un en-tête 4xx code.

2voto

Exomancer Points 129

Je pense que la carte sera sensible à la casse, et vous devez également extraire le nom de l'hôte de l'adresse IP. Referer . Je ne l'ai pas du tout testé mais quelque chose comme ça pourrait peut-être fonctionner :

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]

Ne vous embarrassez pas de codes de réponse inhabituels ; la valeur par défaut de 302 est parfaite.

0 votes

Ah, bien sûr. Je vous remercie. La seule chose dont je ne suis pas sûr, ce sont les arguments de la dernière ligne - est-ce que ça devrait être [L] être [R,L] (avec R=302 étant implicite) ?

1 votes

Je pense que le [R] n'est pas nécessaire car la réécriture se fait vers une URL absolue, ce que mod_rewrite fait par défaut.

0voto

Owen Blacker Points 631

Ce que nous avons fini par faire est le suivant :

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

Le premier RewriteCond (et plusieurs autres lignes du même genre) signifie que les développeurs et le client ne sont pas limités par cette vérification du référent (car il est vraiment fatigant de devoir aller d'abord là-bas avant d'aller sur notre site).

Le deuxième RewriteCond est un travail de génie qui permet de vérifier si le référent est le même que celui de l'utilisateur. Host: dans la demande. Ceci est basé sur terrye 's réponse à SO#7398191 : Vérification générique des références du mod_rewrite - parce que mod_rewrite ne fait que l'interpolation variable dans la chaîne de test, vous ne pouvez pas avoir une ligne lisant

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

car il ne fera tout simplement pas ce contrôle.

Apparemment, nous n'aurons "jamais" besoin d'autoriser d'autres référents. Si c'était le cas, je suppose que je devrais juste définir cette dernière option. RewriteCond ligne à la fin [NC,OR] et enchaîner quelques conditions supplémentaires.

Tout fonctionne bien. Merci pour votre aide, tout le monde !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X