Page 1 sur 2

HTTP REFERER autoriser que 3 pages à acceder à une page

Posté : 19 juin 2007, 12:44
par Stinger
j'ai mis ce code pour n'autoriser que l'une de ces 3 url à venir sur cette page
if( ! isset( $_SERVER['HTTP_REFERER'] ) ) {$_SERVER['HTTP_REFERER'] = "" ; }
$condition = "http://www.toto1.php"; // la page 1 autorisée
$condition2 = "http://www.toto2.php"; // la page 2 autorisée
$condition3 = "http://www.toto3.php"; // la page 3 autorisée
if( ($condition != $_SERVER['HTTP_REFERER']) || ($condition2 != $_SERVER['HTTP_REFERER']) || ($condition3 != $_SERVER['HTTP_REFERER']) ) // si different  de l'une de ces 3 pages
{
header("Location:http://www.message_erreur.php "); // on le renvoie ici

}
mais le bleme c'est que même si je viens de l'une des page autorisée ça redirige sur la page message_erreur.php

pourriez vous me dire ou est le problème ?
:(

merci à vous

Posté : 19 juin 2007, 12:51
par zeus
Ton test ressemble à ça, en francais :

Code : Tout sélectionner

Si ma page est différente de la 1ere page authorisé OU si elle est différente de la 2nd page authorisé OU si elle est différente de la 3eme page autorisée Alors rediriger vers la page d'erreur Finsi
Comme ta page ne peut être 3 page à la fois, elle est toujours au moins différents dans 2 des 3 tests et le if est toujours VRAI.

De plus, le REFERER est la page d'où tu viens, pas où tu vas. Ton test va donc vérifier que tu viens d'une page autorisée. ;)

Posté : 19 juin 2007, 13:32
par Stinger
merci pour ta réponse

donc avec if c'est impossible ?
est ce qu'il faut utiliser elseif ?

je voudrais que si on ne vient pas de page1 ou de page2 ou de page3
ça ailles sur message_erreur.php


pourtant dans mon test il vérifie que si c'est différend ( != ) il doit aller sur la page d'erreur

Posté : 19 juin 2007, 14:01
par zeus
en fait, ce que je voulais te monter, c'est le fonctionnement de ton IF.

le code redirige si le IF retourne TRUE.
Le IF retourne TRUE si l'une des 3 condition est TRUE (a cause des OU)
Chaque condition regarde si le REFERER est différent d'une page spécifique.

Déjà, est-ce que tu comprend ces 3 postulats ?
Si oui : tu es d'accord que le REFERER ne contient qu'une seule adresse ?

Donc, dans ton test si le REFERER ne correspond à aucune de tes pages spécifique, les 3 conditions retourne TRUE, le IF retourne TRUE.
si le REFERER correspond à l'une des 3 pages, la condition portant sur cette page retourne FALSE et les 2 autres retournent TRUE => FALSE ou TRUE ou TRUE retourne TRUE.

Tu es donc obligé de passer dans le IF.

Il faut que tu revois les conditions de ton IF ;)

Posté : 19 juin 2007, 14:46
par Garth
je ne suis pas un pro du php mais comme la dis Zeus revois ton If
if( ! isset( $_SERVER['HTTP_REFERER'] ) ) {$_SERVER['HTTP_REFERER'] = "" ; }

$condition = "http://www.toto1.php"; // la page 1 autorisée

$condition2 = "http://www.toto2.php"; // la page 2 autorisée

$condition3 = "http://www.toto3.php"; // la page 3 autorisée

if ($condition != $_SERVER['HTTP_REFERER'])
//la page que tu veux afficher
else if ($condition2 != $_SERVER['HTTP_REFERER'])

else if ($condition3 != $_SERVER['HTTP_REFERER'])  // si different  de l'une de ces 3 pages

else

header("Location:http://www.message_erreur.php "); // on le renvoie ici
tu peux utiliser le switch aussi
corriger moi si je me trompe

Posté : 19 juin 2007, 15:25
par zeus
ce n'est pas une question de elseif ...

c'est juste qu'il ne faut revoir le IF pour qu'il ne déclenche une erreur que si la page d'où on vient de correspond pas à l'une des 3 pages.

J'ai mis en gras la condition, à toi de la traduire en PHP ;)

Posté : 19 juin 2007, 16:22
par Garth
:oops: :oops: :oops:
je suis vraiment un abruti #-o #-o |*() |*()
on ne doit pas utiliser le "ou" mais le "et"
if( ($condition != $_SERVER['HTTP_REFERER']) && ($condition2 != $_SERVER['HTTP_REFERER']) && ($condition3 != $_SERVER['HTTP_REFERER']) )
la c'est bon normalement
sinon je me :tir2:

Posté : 19 juin 2007, 17:40
par zeus
J'aurais préférer que tu laisses Stinger trouver tout seul mais je pense, effectivement, que c'est ça ;)

Posté : 19 juin 2007, 18:54
par Stinger
desolé mais Garth a été plus rapide et en plus je suis un jeune pousse en php

merci beaucoup, je vais tester ça et voir du coté de switch et break

Posté : 20 juin 2007, 08:05
par Garth
J'aurais préférer que tu laisses Stinger trouver tout seul mais je pense, effectivement, que c'est ça ;)
il est vrai que j'ai donner la réponse en mettant le code mais il faut mieux la trouver par soi même
je n’aurais pas du mettre le code
desolé mais Garth a été plus rapide et en plus je suis un jeune pousse en php
Je début aussi en PHP même mais si je connais d’autre d’autres langages de prog quand tu fais une ligne de code peut importe si c’est du PHP du VB …
Fait un test comment Zeus c'est plus simple apres tu le traduit dans le langage que tu veux

Code : Tout sélectionner

Si ma page est différente de la 1ere page autorisé OU si elle est différente de la 2nd page autorisé OU si elle est différente de la 3eme page autorisée Alors rediriger vers la page d'erreur Finsi

Posté : 20 juin 2007, 10:53
par Stinger
Le code fonctionne ! :D
if( ! isset( $_SERVER['HTTP_REFERER'] ) ) {$_SERVER['HTTP_REFERER'] = "" ; }
$condition = "http://localhost/Web_Service/toto1.php"; // la page 1 autorisée 

$condition2 = "http://localhost/Web_Service/toto2.php"; // la page 2 autorisée 

$condition3 = "http://localhost/Web_Service/toto3.php"; // la page 3 autorisée

if( ($condition != $_SERVER['HTTP_REFERER']) && ($condition2 != $_SERVER['HTTP_REFERER']) && ($condition3 != $_SERVER['HTTP_REFERER']) ) // si différent de l’une de ces 3 pages
{
header("Location:http://www.memopage.com/webservice/message_erreur.php "); // on le renvoie ici
}
le problème :?

c’est qu’en fait au lieu de toto2.php j’ai une centaine d’url du type
toto2.php ?idc=truc1
toto2.php ?idc=truc2 etc.. ( page chargé dynamiquement via sql )

quant je suis sur toto2.php ?idc=truc1 et que je veux revenir sur toto1.php, bien sur il m’envoie bouler sur la page de redirect

bien sur je peux répéter une centaine de condition mais comment écrire ça plus élégamment

y’a t’il un moyen de remplacer dans l’url une partie par un terme générique ou bien de mette plutot un nom de domaine que une url précise

merci

Posté : 20 juin 2007, 11:02
par Rei Itchido
Je rajouterais que si ta page continue sous ce test, il faut mettre exit(); après le header pour que la redirection soit bien effective ;)

http://fr.php.net/header
if( ($condition != $_SERVER['HTTP_REFERER']) && ($condition2 != $_SERVER['HTTP_REFERER']) && ($condition3 != $_SERVER['HTTP_REFERER']) ) // si différent de l’une de ces 3 pages
{
header("Location:http://www.memopage.com/webservice/message_erreur.php "); // on le renvoie ici
exit();
}

Posté : 20 juin 2007, 11:03
par zeus
Déjà, pense à utiliser les balises

Code : Tout sélectionner

et PHP qui sont disponibles au dessus de la zone de saisie quand tu postes un message. Ca fait 2 fois que je modifie ton message ;) Ensuite, tu peux remplir un tableau contenant toutes les urls d'où tu ne doit pas venir, et tu peux simplement tester si le REFERER n'est pas présent dans ce tableau. exemple en reprenant ton code, en le réindentant et en le commentant : [php]// Initialisation du referer if( !isset( $_SERVER['HTTP_REFERER'] ) ) { $_SERVER['HTTP_REFERER'] = "" ; } // Remplissage du tableau d'url authorisée $a_allowed_url[] = "http://localhost/Web_Service/toto1.php"; // la page 1 autorisée $a_allowed_url[] = "http://localhost/Web_Service/toto2.php"; // la page 2 autorisée $a_allowed_url[] = "http://localhost/Web_Service/toto3.php"; // la page 3 autorisée // Si le referer n'est aucune des pages autorisées if ( !in_array($_SERVER[HTTP_REFERER''], $a_allowed_url) ) { // Redirection header("Location:http://www.memopage.com/webservice/message_erreur.php "); // on le renvoie ici }[/php] Il ne te reste plus qu'ensuite à ajouter une url pour que le test évolue, même pas besoin de retoucher le script

Posté : 20 juin 2007, 11:25
par Stinger
ça marche merci Zeus, (j'ai corrigé ton erreur de frappe tu avait mis

Code : Tout sélectionner

[HTTP_REFERER'']
au lieu de

Code : Tout sélectionner

['HTTP_REFERER']
ça avance pour moi c'est super

est ce possible plutôt que de rentrer une centaine de ligne n'y aurait-il pas moyen dans l'url du type toto2.php?idc=truc de mettre quelquechose du genre toto2.php?*.* ( caractere joker en sorte )

merci 2000 fois

Posté : 20 juin 2007, 11:38
par zeus
A part insérer une notion d'expression régulière, je ne vois pas :-k
Par contre, la présence d'expressions régulières complique grandement l'utilisation de in_array() :S