HTTP REFERER autoriser que 3 pages à acceder à une page

Eléphanteau du PHP | 13 Messages

19 juin 2007, 12:44

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 juin 2007, 12:51

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. ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 13 Messages

19 juin 2007, 13:32

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 juin 2007, 14:01

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 51 Messages

19 juin 2007, 14:46

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 juin 2007, 15:25

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 51 Messages

19 juin 2007, 16:22

: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:
Modifié en dernier par Garth le 20 juin 2007, 07:37, modifié 1 fois.
Il y a ceux qui pensent, Il y a ceux qui croient et Il y a ceux qui doutent. Je pense que je crois que je doute. :-k
Image

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 juin 2007, 17:40

J'aurais préférer que tu laisses Stinger trouver tout seul mais je pense, effectivement, que c'est ça ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 13 Messages

19 juin 2007, 18:54

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

Eléphant du PHP | 51 Messages

20 juin 2007, 08:05

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
Il y a ceux qui pensent, Il y a ceux qui croient et Il y a ceux qui doutent. Je pense que je crois que je doute. :-k
Image

Eléphanteau du PHP | 13 Messages

20 juin 2007, 10:53

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

Eléphant du PHP | 396 Messages

20 juin 2007, 11:02

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();
}

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 juin 2007, 11:03

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 13 Messages

20 juin 2007, 11:25

ç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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 juin 2007, 11:38

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
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer