8792 sujets

Développement web côté serveur, CMS

Bonjour,

Je viens de mettre en place un systeme de sesion sur un site, dont le but est de limité l'accés a une partie aux seul utilisateurs enregistrés dans ma base d'adhérent...
Lorsque l'adhérent s'identifie il arrive sur la page index2.php qui lui est reservé.
Si quelqu'un essaie d'acceder a cette page sans etre connecté il est alors redirigé vers la page publique index1.php...

Vous allez me dire: Et bien tout va bien?

Non! Mon probleme:
Ma page index2.php, affiche le contenu(par exemple accueil2.php ) grace à un include, tandis que le reste de la page ne change pas.

MAIS

Si un utilisateur tente d'accéder à accueil.php directement sans passer par l'index il arrive sans probleme.....

Comment bloqué l'accé au contenu sachant que session_start() ne peut etre appelé qu'une seul fois et seulement au debut d'une page....

Merci de votre aide...
Tu rentres les pages autorisé dans un tableau, afin de ne pouvoir appeler que des pages prédéfini, tu place tout ca dans une condition, et c'est bon logiquement. ^^

Bon, le code, je n'ai jamais éssayé, je ne sais pas s'il fonctionne :


<?php

if(isset($_SESSION['login'])) { //on vérifie que la session est "ouverte", si c'est le cas, effectuer le code suivant

  // On définit le tableau contenant les pages autorisées
   $pageOK = array('accueil2' => '.accueil2.php',
                  'page2' => 'page2.php');

  // Oon vérifie que l'URL fonctionne et est  bien dans le tableau.
  if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) ) {
    include($pageOK[$_GET['page']]);   //appelle du contenu
  } else {
    include('accueil.php');   // page appelé par defaut
  }
}
else {
  // On définit le tableau contenant les pages autorisées
   $pageOK = array('accueil' => '.accueil.php',
                  'page' => 'page.php');

  if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) ) {
    include($pageOK[$_GET['page']]);  
 
  } 
else { //si la fonction n'est pas ouverte, effectuer le code suivant.

    include('accueil.php');   
}
?>


Logiquement, les pages appelés en PHP (si j'ai bien compris ce que tu as dis) différeront si on est loggué, ou non.

Maintenant, si le problème était tout autre...n'hesite pas. ^^

En relisant, je me demande si j'ai bien compris. Smiley lol
En fait, tu dis que les pages sont accessible directement si on tape l'URL dans la barre d'adresse, non ?
Là, a part les "URL rewritters", je ne sais pas trop comment limiter...il doit y avoir un moyen, genre une redirection automatique...peut être ça :



if(!isset($_SESSION['login'])) { //si la session n'est pas ouverte 
 header("location : error.php"); //redirection vers "error.php"
}



Error.php étant un truc tout simple :




<?php
echo "Vous n'êtes pas autorisé à accéder a cette partie du site.<br />
<a href="index.php?page=accueil>Retour</a>";
?>

Modifié par TheReverendEVIL (18 May 2006 - 14:37)
Oui le probleme c'est que pour le moment un utilisateur non enregistré peut (si il connait l'arborescence du site) taper l'adresse de mes pages incluses et ainsi contourner l'index ...

En effet seul l'index est securisé par test de presence du login dans la session.

imaginons:
- Une personne mal intentionné à reussi a savoir que la page index inclus recherche.php
- Elle tape dans son navigateur : www.monsite.fr/include/recherche.php
- Cette page s'affiche sans probleme car seul l'index est securisé

Si maintenant je fais le meme test que sur l'index sur la page recherche.php, cela provoquera des conflis et des messages d'erreur lors de l'appel de mon index:
session_start() ne peut etre appelé qu'en debut de page et ne peut apparaitre qu'une fois par page.

J'espere etre plus clair. Smiley biggrin
Modifié par Dodjo (18 May 2006 - 15:08)
Héhé...oui c'est vrai ça...

Je crois qu'un fichier peut être appelé via PHP sans demander d'autorisation s'il est protégé par htacces, mais là, je n'en suis pas sûr du tout, j'ai du lire ca une fois... :lol:
J'ai essayer ce que tu m'avais suggéré:


if(!isset($_SESSION['login'])) { //si la session n'est pas ouverte 

 header("location : error.php"); //redirection vers "error.php"

}

Et ca a l'air de marcher!

En lisant bon nombre de tutoriaux je pensait que l'on etait obligé de faire comme ceci:

session_start();
if(!isset($_SESSION['login'])) { //si la session n'est pas ouverte 

 header("location : error.php"); //redirection vers "error.php"

}


Je ne comprend pas pourquoi j'ai galérer a rajouter des session_start() de partout... Smiley bawling

Saurais tu m'expliquer pourquoi?
Cela ne sert a rien si ca marche sans que je sache pourquoi Smiley langue

En tout cas merci Smiley biggrin
Modifié par Dodjo (18 May 2006 - 15:16)
J'ai regardé un peu Htaccess mais cela m'oblige a avoir un formulaire de connexion horrible...
Dodjo a écrit :
Saurais tu m'expliquer pourquoi?
Cela ne sert a rien si ca marche sans que je sache pourquoi langue


Heu...lol...la vérif n'a logiquement pas besoin du session_start car elle vérifie justement si la session n'est pas ouverte.
Comme, lorsqu'on ouvre directement le fichier, il n'y a pas de session, c'est tout bon, maintenant, si tu avais fais un verif pour savoir si elle était ouverte, la j'avous ne pas savoir...ca doit rapporter une erreur (sauf s'il y a un "else").
Enfin, je pense, je ne suis pas sûr...mais c'est logique pour moi. ^^
Ensuite, une fois inclue dans ta page, vu que la session est ouverte, le "header" n'est pas appliqué.
Donc en fait tout tiens a ce petit "!"...c'est dingue. Smiley biggol

Bah, ecoutes, de rien, ravis de servir a quelque chose. ^^
Modifié par TheReverendEVIL (18 May 2006 - 16:16)
hello !

Et bien j'ai le même soucis que Dodjo, je me permet de continuer le poste... parce que j'ai pas bien compris ce qu'il fallait faire pour protéger sa page incluse si on tappe son adresse complète...

Excusez moi je débute tout juste en php et c'est laborieux... Smiley rolleyes




Pour ma part j'ai ça:



<?php

  // On définit le tableau contenant les pages autorisés
  // ----------------------------------------------------
  $contenuOK = array(

				'compte' => 'pages/compte/compte.php',
			        'divers' => 'pages/divers/page.php' );

  // On teste que le paramètre d'url existe et qu'il est bien autorisé;
  // -----------------------------------------------------------------
  if ( (isset($_GET['contenu'])) && (isset($contenuOK[$_GET['contenu']])) ) {
    include($contenuOK[$_GET['contenu']]);   // Nous appelons le contenu central de la page
  }
  else 
{ 
// page par défaut 
include('pages/news/news.php'); 
} 

?>




Je ne sais pas comment ni où placer le code qui regarde si la session est ouverte ou non c-à-d:

if(!isset($_SESSION['login'])) { //si la session n'est pas ouverte 



 header("location : error.php"); //redirection vers "error.php"



}




Enfin bref, si vous pourriez me donner un coup de patte ... Smiley ravi Parce que je patauge là Smiley sweatdrop Merci
Au début de ton fichier index2.php :
$variable_bidon = 123;

Au début des autres fichiers qui doivent être sécurisés :
if (!isset($variable_bidon)) { .... }

comme ça, s'ils ne sont pas appelés par un include depuis l'index2, la variable bidon n'existera pas et donc tu pourras réagir en fonction.
si tu appel par include tu peux aussi tester une tentative d'ouverture direct apr trois procédé...

un eregi de $PHP_SELF qui s'il y trouve le nom d ela page alors c'est qu'elle à été ouverte par accé direct et tu conclus sur un die();//exit;

un if(!IN_MYSITE)exit;

ou IN_MYSITE est un define (souvent dans le fichier config.ini...) qui est sur true.

ou comme montré juste plus haut un test de la session...

pour les include dynamic il faut protégé ce denrier par un
if (is_file("path/${include}.php"){include(("path/${include}.php");}
else {include(("path/404.php");} // gestion d'erreur 404.

après libre de choix
Ok je vais essayer d'adopter la solution de QuentinC ...


Bon ... faudrait presque rediriger ce poste dans la partie "débutant" du forum .... Smiley rolleyes

Bref...

Voilà ce que j'ai fait pour sécuriser les pages à inclure ...
Mais je sais pas comment dire "si tu trouve la variable_bidon = 123 , tu affiches la page ...

autrement tu vas à la page erreur.php ...


Vraiment désolée de vous importuner avec des question si basique ... Smiley sweatdrop



<?php 
if (!isset($variable_bidon)) {

$variable_bidon=123
}


else 
{ 

// page par d'erreur 

Header ("Location: erreur.php");
exit(); 

} 


?>

Ha bah...tu sais pas a quoi sert le isset et le header alors ,

Smiley rolleyes Smiley biggrin

Bon, c'est tout simple...


if(isset($variable_bidon)) { 

 header("location : error.php"); 

}


Le "!" devant le isset dans le code que tu as fourni correspond a la negation, car ca servait a testé si la variable n'avait pas été récupérée.