7
votes

Vérification du référent PHP

Donc, j'ai besoin de vérifier le référent sur une page à l'aide de PHP, et s'il est * .Example.com, ou * .anoftite.com, exécutez le code, mais sinon, rediriger ailleurs.

Comment irai vérifier si le http_reger est égal à ces valeurs, avec un caractère générique?

Merci!

Edit: L'URL contiendra plus d'un domaine. La regex doit donc correspondre à la première occurrence trouvée.


2 commentaires

Sachez que si vous ne pouvez contrôler les navigateurs accéder à ce script, vous ne pouvez pas compter beaucoup sur http_referrer. Il sera souvent vide, tel que si redirigé à partir d'un site SSL, ou si l'utilisateur définit les paramètres de sécurité du navigateur pour empêcher l'envoi du http_referrer.


Ouais, je n'ai pas besoin de m'appuyer fortement, c'est une vérification supplémentaire.


5 Réponses :


1
votes

Essayez ceci:

if (preg_match('/\.example\.(com|org)/', $_SERVER['HTTP_REFERER']))
{
  // execute your code
}
else
{
  header("Location: http://example.com/redirectpage.htm");
  exit();
}


0 commentaires

5
votes
$ref = $_SERVER['HTTP_REFERER'];
if (strpos($ref, 'example.com') !== FALSE) {
   redirect to wherever example.com people should go
}
if (strpos($ref, 'example.org') !== FALSE) {
    redirect to wherever example.org people should go
}
Of course, this only works if the referer is "nice". For instance, coming from google you could possibly have "example.org" in the search term somewhere, in which case strpos would see it, and redirect, even though you came from google.

3 commentaires

Et si l'hôte autorisé est iana.org et que le référeur est www.iana.org.nyud.net ? (domaine réel)


La vérification des référateurs est rarement fiable, car c'est quelque chose qui est complètement sous le contrôle de l'utilisateur.


Et si l'adresse de la page de l'attaquant est http :: //evil-atacker.org/example.com / ...



1
votes

Preg_Match ('/ (. +?) \. Exemple \. (COM | ORG) /', $ _ Server ['http_referer'])

Ceci ne correspondra qu'une adresse qui possède un sous-domaine, et il ne continuera pas à ne rien chercher à chercher quoi que ce soit au-delà de sous-domaines.example.com ou .org . I.e. sous-domaine.example.com/some-OTTher-Stuff . Avez-vous besoin de correspondre également à ceux-ci?

correction - cela correspondra à www.example.com mais ne correspondra pas exemple.com . .


0 commentaires

30
votes

devrait le faire: xxx


0 commentaires

6
votes

Autres réponses Les «chèques» sont bons mais ne sont pas strictement liés à votre site Web. Donc, par exemple, référenant avec valeur http://attacker.com/www.example.com/ passera presque tous les chèques. Et il est très facile de faire un tel site et d'envoyer une demande croisée croisée.

Il existe une méthode fiable et sécurisée pour vérifier si le référateur est vraiment votre domaine . Bien sûr, le référenant peut être utilisé, mais une victime d'un site d'attaquant enverra un référent correct.

Le truc est dans ^ caractère spécial. Voici la regex magique: xxx

^ - garantit que nous sommes au début
https? - Protocole - HTTP ou HTTPS
(([A-Z0-9 -] +) \.) * - correspond à des sous-domaines, également de niveaux plus élevés, s'il est de
Exemple \ .com - correspond à un domaine principal
/ - assure le démarrage du chemin afin que le nom de domaine ne puisse pas continuer


4 commentaires

Si vous souhaitez soit http ou https, il devrait être http? ;)


@Alekwisnia no ... point d'interrogation signifie que le caractère avant d'avoir lieu à max une fois (il peut donc être aussi 0 fois). Donc https? correspondances http et https et votre exemple correspondent httt et http http http http http


Étant donné que le référent peut être spoofé ou complètement omis, cela devrait être la réponse n ° 1 comme chaque petit bit aide. (La seule chose que j'ajouterais est l'utilisation de $ _Server ['nom_serveur'] au lieu de coder du disque dur du nom de domaine.)


Je viens de revenir à cela une décennie (!) Plus tard, la méthode la plus sécurisée est définitivement la bonne réponse!