[RESOLU] Protéger une page utilisateurs

Eléphanteau du PHP | 30 Messages

23 nov. 2013, 11:51

Salut ! Voilà sur mon site je souhaiterai réservé l’accès à certaines pages uniquement pour les membres.

Dans ce but j'utilise une fonction qui renvois true ou false si la personne est connecté.

Voici l'exemple d'une page membre :
<?php include("inclusion/top_inc.php");  
 if($user >0) {
 	?>
	 <article> <!-- /// Partie contenu \\\ --> 
	        <h2 id="top_section"><?php echo $_SESSION['Auth']['etat']; ?></h2>
	            <div id="conteneur_texte"> <!-- /// Contenu article \\\ --> 
					<div id="conteneur_photo_membre2">
						<div id="photo_profil_membre"><img class="img_user2" src="<?php echo $_SESSION['Auth']['image']; ?>"></div>
					<a href="modifier_image.php">Modifier</a>
					</div>
					<h3><?php echo $_SESSION['Auth']['nom'] .' '. $_SESSION['Auth']['prenom']; ?></h3>
					<?php mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
		            mysql_select_db(DB_BDD);
		            mysql_query ('SET NAMES "UTF8"');
					$id_user = $_SESSION['Auth']['id'];
					$sql = "SELECT * FROM  membre WHERE id=$id_user";
		            $req2 = mysql_query($sql) or die('Erreur SQL !<br />' .$sql. '<br />' .mysql_error());
		            while ($data2 = mysql_fetch_assoc($req2)) {
		                $date_naissance = htmlentities($data2['date']);
						$adresse = htmlentities($data2['adresse']);
						$ville = htmlentities($data2['ville']);
						$codep = htmlentities($data2['codep']);
						$tel = htmlentities($data2['tel']);
		            } ?>
					
					 <ul id="liste_profil">
					 	<li><p class="liste_profil_li">Mail :<span class="champ_profil_user"><?php echo $_SESSION['Auth']['mail'] ?></span></p></li>
					 	<li><p class="liste_profil_li">Date de naissance :<span class="champ_profil_user"><?php echo $date_naissance; ?></p></li>
					 	<li><p class="liste_profil_li">Adresse :<span class="champ_profil_user"><?php echo $adresse ?></span></p></li>
					 	<li><p class="liste_profil_li">Ville :<span class="champ_profil_user"><?php echo $ville ?></span></p></li>
					 	<li><p class="liste_profil_li">Code postal :<span class="champ_profil_user"><?php echo $codep ?></span></p></li>
					 	<li><p class="liste_profil_li">Téléphone :<span class="champ_profil_user"><?php echo $tel ?></span></p></li>
					 </ul>    
					 <i><p style="color: red;"><?php if($_SESSION['Auth']['niveau']){echo 'Vous êtes administrateur !';}?></p></i>     
				</div>
	    </article>
	</section>
	<?php include("inclusion/bottom_inc.php");
} 
 else { header('location:index.php'); 

} ?>
Tout va bien quand on est connecter mais une fois déconnecter j'ai cette erreur :
Warning: Cannot modify header information - headers already sent by (output started at /home/alcudia/www/inclusion/top_inc.php:134) in /home/alcudia/www/profil.php on line 40

Le problème c'est que je n'arrive pas à faire autrement car si je n'inclue pas mon header qui contient mon fichier config et donc ma fonction qui appel $user cela ne marche donc pas.

Si quelqu'un à une idée pour éviter d'avoir cette erreur, je suis preneur ^^

Merci d'avance.

Mammouth du PHP | 790 Messages

23 nov. 2013, 13:10

A pemière vu, ton fichier top_inc.php aurais déjà envoyer des infos pour construire la page donc php refuse de rediriger...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Eléphanteau du PHP | 30 Messages

23 nov. 2013, 14:39

Oui en faite j'inclue mon fichier top_inc car dedans il a mon fichier config inclus. J'ai besoin de ce fichier config car il a ma fonction qui vérifie si la personne est connecté.

Si je ne met pas le fichier top_inc avant ma condition je ne pas avoir ma fonction de verification et si je ne le fait pas cela ne marche pas =(

Quelqu'un aurait une idée plus pratique pour protéger ma page membre en utilisant mes sessions contenu dans mon top_inc ?

Mammouth du PHP | 790 Messages

23 nov. 2013, 14:50

Bien comme tu ne montre pas ce top_inc, je vais te répondre d'appeller une fonction juste avant dans le genre:
function verifSession() {
    if (!isset($_SESSION['......']) || ($_SESSION['......']) === '') {
        header("location: 404.php");
        exit();
    }
}

verifSession()

include("inclusion/top_inc.php");
Mais ce n'est qu'une idée...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

23 nov. 2013, 15:02

Plus logiquement la vérification se fait dans le fichier top.
Ceci simplement parce que ce n'est pas la peine de faire un tas de chose spécifique a l'utilisateur si tu n'est pas connecté.

Tu peux imaginer de faire un truc un peux plus sexy pour l'utilisateur avec un beau message d'erreur et une redirection javascript (comme ici lorsque tu as posté un message même si ce n'est pas forcément pour la même raison ;)).

Sinon il faut un découpage plus logique de la chose (comme un mvc ;) ) mais c'est un poil plus complexe.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 30 Messages

23 nov. 2013, 15:26

Merci pour vos idées, je me laisserai bien tenter par une redirection en javascript mais le problème est que si on désactive qu'adviendra de ma page protégée =s

Edit :
Sinon j'ai essayer en gros de tester ma page comme ça :
<?php   
if (!isset($_SESSION['Auth']) || ($_SESSION['Auth']) === '') {
	header('location:index.php');
 	
} 
 else { 
 	include("inclusion/top_inc.php");
 	?>
	 <article> <!-- /// Partie contenu \\\ --> 
	        <h2 id="top_section"><?php echo $_SESSION['Auth']['etat']; ?></h2>
	            <div id="conteneur_texte"> <!-- /// Contenu article \\\ --> 
					<div id="conteneur_photo_membre2">
						<div id="photo_profil_membre"><img class="img_user2" src="<?php echo $_SESSION['Auth']['image']; ?>"></div>
					<a href="modifier_image.php">Modifier</a>
					</div>
					<h3><?php echo $_SESSION['Auth']['nom'] .' '. $_SESSION['Auth']['prenom']; ?></h3>
					<?php mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
		            mysql_select_db(DB_BDD);
		            mysql_query ('SET NAMES "UTF8"');
					$id_user = $_SESSION['Auth']['id'];
					$sql = "SELECT * FROM  membre WHERE id=$id_user";
		            $req2 = mysql_query($sql) or die('Erreur SQL !<br />' .$sql. '<br />' .mysql_error());
		            while ($data2 = mysql_fetch_assoc($req2)) {
		                $date_naissance = htmlentities($data2['date']);
						$adresse = htmlentities($data2['adresse']);
						$ville = htmlentities($data2['ville']);
						$codep = htmlentities($data2['codep']);
						$tel = htmlentities($data2['tel']);
		            } ?>
					
					 <ul id="liste_profil">
					 	<li><p class="liste_profil_li">Mail :<span class="champ_profil_user"><?php echo $_SESSION['Auth']['mail'] ?></span></p></li>
					 	<li><p class="liste_profil_li">Date de naissance :<span class="champ_profil_user"><?php echo $date_naissance; ?></p></li>
					 	<li><p class="liste_profil_li">Adresse :<span class="champ_profil_user"><?php echo $adresse ?></span></p></li>
					 	<li><p class="liste_profil_li">Ville :<span class="champ_profil_user"><?php echo $ville ?></span></p></li>
					 	<li><p class="liste_profil_li">Code postal :<span class="champ_profil_user"><?php echo $codep ?></span></p></li>
					 	<li><p class="liste_profil_li">Téléphone :<span class="champ_profil_user"><?php echo $tel ?></span></p></li>
					 </ul>    
					 <i><p style="color: red;"><?php if($_SESSION['Auth']['niveau']){echo 'Vous êtes administrateur !';}?></p></i>     
				</div>
	    </article>
	</section>
	<?php include("inclusion/bottom_inc.php");} ?>
Ca marche très bien si on n'est pas connecter on ne peut y accédez mais si on n'est connecté ca redirige aussi =/

Mammouth du PHP | 790 Messages

23 nov. 2013, 17:05

Est tu sur de $_SESSION['Auth']
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Eléphanteau du PHP | 30 Messages

23 nov. 2013, 19:23

J'enregistre mes sessions dans top_inc comme ça :
$_SESSION['Auth'] = array(
                    'mail' => $_POST['mail'],
                    'mdp' => $_POST['mdp'],
                    'id' =>  htmlentities($data['id']),
                    'nom' =>   htmlentities($data["nom"], ENT_QUOTES,"UTF-8"),
                    'prenom' =>  htmlentities($data["prenom"], ENT_QUOTES,"UTF-8"),
                    'niveau' =>  htmlentities($data['niveau']), 
                    'image' =>  htmlentities($data["image"], ENT_QUOTES,"UTF-8"),
		
                );     
J'ai même tester avec ['Auth]['mail'] aussi mais pas moyen d'accéder la page.

Mammouth du PHP | 790 Messages

23 nov. 2013, 20:38

As tu déclaré session_start() ?
Que donne un var_dump de $_SESSION ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Eléphanteau du PHP | 30 Messages

23 nov. 2013, 23:08

Alors j'ai déclarer sessions start avant le if et ca marche très bien je ne peux pas accéder à la page si je ne suis pas connecter mais lorsque que je suis connecter j'ai l'erreur :
Notice: A session had already been started - ignoring session_start() in /home/alcudia/www/inclusion/top_inc.php on line 1
Car mes sessions sont déjà lancer dans le top_inc =(

Edit : J'ai tenter de mettre
if(!isset($_SESSION)){
    session_start();
}
Dans mon entête ca a l'air de marcher pour l'instant.

Merci pour votre aide en tout cas =)

Mammouth du PHP | 790 Messages

24 nov. 2013, 14:14

C'est donc a mon avis qu'il faut revenir sur ce que t'a dis Moogli, a savoir réorganiser le contenu de ce top_inc !
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.