Page 1 sur 2

connexion automatique

Posté : 02 nov. 2011, 21:40
par spedgreg
Bonsoir tout le monde :wink:
J'ai fais un espace membre avec des SESSIONS et je veux intégrer "une connexion automatique" sur ma page "connexion.inc.php" Si je coche "connexion automatique" mes 2 cookies s'enregistre bien, donc là c'est OK!

Mais le problème vient sur ma page "index.php" et "page_membre.php" c'est là que je bloque je ne sais pas comment faire...vu j'utilise des SESSIONS je veux intégré la lecture des 2 cookies si la personne veut être toujours connectée

ça fais 5 jours j'essaye plusieurs possibilité et je sature :(

voici mes pages :
page "connexion.inc.php
<?php

// Redirige l'utilisateur s'il est déjà identifié
if(isset($_SESSION['id_nom']))
{
     header("Location: page_membre.php");
}
else
{
     
     // Formulaire visible par défaut
     $masquer_formulaire = false;
     
     // Une fois le formulaire envoyé
     if(isset($_POST["BT_Envoyer"]))
     {
          
          // Vérification de la validité des champs
          if(!preg_match("/^[A-Za-z0-9_]{4,20}$/", $_POST["TB_Nom_Utilisateur"]))
          {
               $message = "Votre nom d'utilisateur doit comporter entre 4 et 20 caractères<br />\n";
               $message .= "L'utilisation de l'underscore est autorisée";
          }
          elseif(!preg_match("/^[A-Za-z0-9]{4,}$/", $_POST["TB_Mot_de_Passe"]))
          {
               $message = "Votre mot de passe doit comporter au moins 4 caractères";
          }
          else
          {
               
               // Connexion à la base de données
               // Valeurs à modifier selon vos paramètres configuration
                require "connexionMysql.inc.php";
               mysql_connect(DB_HOST, DB_LOGIN);
               mysql_select_db(DB_BDD);
               
               // Sélection de l'utilisateur concerné
               $result = mysql_query("
                    SELECT id, Nom_Utilisateur, Mot_de_Passe, Compte_Active
                    FROM Comptes_Utilisateurs
                    WHERE Nom_Utilisateur = '" . $_POST["TB_Nom_Utilisateur"] . "'
               ");
               
               // Si une erreur survient
               if(!$result)
               {
                    $message = "Une erreur est survenue lors de la tentative de connexion";
               }
               else
               {
                    
                    // Si aucun utilisateur n'a été trouvé
                    if(mysql_num_rows($result) == 0)
                    {
                         $message = "Le nom d'utilisateur " . $_POST["TB_Nom_Utilisateur"] . " n'existe pas";
                    }
                    else
                    {
                         
                         // Récupération des données
                         $row = mysql_fetch_array($result);
                         
                         // Si le compte n'a pas été activé
                         if($row["Compte_Active"] == 0)
                         {
                              $message = "Votre compte utilisateur n'a pas été activé";
                         }
                         else
                         {
                              
                              // Vérification du mot de passe
                              if(md5($_POST["TB_Mot_de_Passe"]) != $row["Mot_de_Passe"])
                              {
                                   $message = "Votre mot de passe est incorrect";
                              }
                              else
                                 {
							                                   
                                           // Création des sessions
								   
		                              $_SESSION['id']=$row["id"];
                                               $_SESSION['id_nom']=$row["Nom_Utilisateur"];
								   
                                    if(isset($_POST['CB_Connexion_Automatique']))
                                         {						  							   								 
                                            // Création des cookies	
									
	                                          $navigateur = (!empty($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
	                                         $hash_cookie = sha1('aaa'.$username.'bbb'.$password.'ccc'.$navigateur.'ddd');
								
			                               // Définition du temps d'expiration des cookies
                                                            $expiration =empty($_POST["CB_Connexion_Automatique"]) ? 0 : time() + 90 * 24 * 60 * 60;
			
                                                                  setcookie( 'id', $_SESSION['id'], $expiration, '/');
                                                               setcookie('connexion_automatique', $hash_cookie, $expiration, '/');
                                              }	 
	                                                    // Redirection de l'utilisateur
                                 
                                                                  header("Location: page_membre.php");
							   
                                             	}
                              
                         }
                         
                    }
                    
               }
               
               // Fermeture de la connexion à la base de données
               mysql_close();
               
          }
          
     }
     
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

<head>
</head>
<body>
                                                       <!-- formulaire connexion --> 
<p class="connection">Se connecter<hr /></p>

<form action="http://<?php echo $_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME"]; ?>" method="post">
     <div class="center">
         <label for="username">Utilisateur ></label><input type="text" name="TB_Nom_Utilisateur" id="username"  /><br />
     
     
          <label for="password">Mot de passe ></label><input type="password" name="TB_Mot_de_Passe" id="password" /><input type="submit" name="BT_Envoyer" value="ok" /><br />
     
     
          <input type="checkbox" name="CB_Connexion_Automatique" />
          connexion automatique
<?php if(isset($message)) { ?>		  
		  
<p class="rouge"><?php echo $message; ?></p>
<?php } if($masquer_formulaire != true) { ?>
     </div>
</form>
                                                        
<?php } ?>

</body>
</html>

MA PAGE "index.php"
<?php
session_start();

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">

<head>

           <title>page index</title>

                                                                <!--Metas-->

<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-language" content="fr" />
</head>

<body>

                                                          <!-- header -->

                                                          <!-- menu -->
 
                                                      													 																																					 
                                                          <!-- corps -->


<div id="corps">
                                                          <!-- espace membre -->
<div class="espacemembre">

<?php if(isset($_SESSION['id'])) { ?>
<p>
      [<?php echo ''.htmlentities($_SESSION['id_nom'], ENT_QUOTES, 'UTF-8'); ?>]
	  <a class="accueil" href="deconnexion.php">Déconnexion</a><hr />
	  	  
	<img src="image/control.gif" alt="espace membre" title="espace membre" />&nbsp;<a class="accueil" href="page_membre.php">Espace utilisateur</a><br />
	
	 
</p>
<?php } else 

{ 
    include("connexion.inc.php");
	echo '<br /><a class="accueil" href="creer-compte-utilisateur.php">S\'inscrire</a>';	
}

?>

</div>	
                                                   


</div>
                                                          <!-- footer -->

<div id="pied_de_page">
<p>© 2011 Tous droits réservés</p>
</div>
</body>
</html>
MA PAGE "page_membre.php"
<?php
session_start();
// Redirige l'utilisateur s'il est pas identifié
if(!isset($_SESSION['id']))
{
     header("Location:index.php");
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>

           <title>Espace membre</title>


                                                                <!--Metas-->

<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-language" content="fr" />

</head>

<body>
                                                          <!-- header -->

                                                          <!-- menu -->

                                                          <!-- corps -->


<div id="corps">
                                                           <!-- espace membre -->
<div class="espacemembre">

<?php if(isset($_SESSION['id'])) { ?>
<p>
      [<?php echo ''.htmlentities($_SESSION['id_nom'], ENT_QUOTES, 'UTF-8'); ?>]
	  <a class="accueil" href="deconnexion.php">Déconnexion</a><hr />	  		 	 
</p>


<?php } ?>

</div>	
                                                                   <!-- corps -->

<h2>ESPACE UTILISATEUR</h2>

    <p>
        Bienvenue sur votre espace personnel, <?php echo ''.htmlentities($_SESSION['id_nom'], ENT_QUOTES, 'UTF-8'); ?> !  
    </p>
</div>
                                                          <!-- footer -->

<div id="pied_de_page">
<p>© 2011 Tous droits réservés</p>
</div>
</body>
</html>



Re: connexion automatique

Posté : 02 nov. 2011, 22:03
par xTG
Il faut que tu vérifies la présence des cookies ainsi que leur validité normalement, mais là avec ton hash je vois mal comment...
Tu as dans un cookie l'id du membre, donc tu peux faire une requête et récupérer son nom d'utilisateur.
Ainsi tu as les deux éléments nécessaires à ta session, il suffit de les transférer dans le tableau $_SESSION et de recharger la page. ;)

Re: connexion automatique

Posté : 02 nov. 2011, 22:24
par spedgreg
oui j'ai 2 cookies id et connexion_automatique es-que j'ai besoin des 2 COOKIES ou 1 seul suffit pour une connexion auto ?

C'est de le mettre en pratique que j'arrive pas :(

Re: connexion automatique

Posté : 03 nov. 2011, 09:56
par xTG
A priori un seul suffit, tester l'existence du cookie de l'id du membre.

Code : Tout sélectionner

Si cookie[id] existe Alors Ouvrir connexion BDD Récupérer dans membre les informations avec id = cookie[id] session[id] = membre[id] session[nom_utilisateur] = membre[nom_utilisateur] Rafraichir page Fin Si
Il n'y a plus qu'à convertir en fonctions PHP, c'est bête et méchant. ;)

Re: connexion automatique

Posté : 03 nov. 2011, 10:55
par spedgreg
Sur ma page connexion.inc.php j'ai supprimé mon hash vu que tu m'as dis qu'un seul cookie est nécessaire, ce qui donne:
else
        {
		  // Création des sessions
								   
		 $_SESSION['id']=$row["id"];
                   $_SESSION['id_nom']=$row["Nom_Utilisateur"];
								   
	if(isset($_POST['CB_Connexion_Automatique']))
		{						  							   								 
			// Création des cookies	
												                        			                        								
			// Définition du temps d'expiration des cookies
                    $expiration =empty($_POST["CB_Connexion_Automatique"]) ? 0 : time() + 90 * 24 * 60 * 60;
                      
                                 setcookie( 'id', $_SESSION['id'], $expiration, '/');
			                         
		 }
								     
		// Redirection de l'utilisateur
	header("Location: /jmc-competition/page_membre.php");
                                  		                       							   
    }					

Sur ma page index.php j'ai rajouté si il y a existence du cookie et je bloque au niveau de ce que j’écris entre les '{ }'
<?php if(isset($_COOKIE['id']) && !isset($_SESSION['id']))

{ 
       
           // que dois-je écrire ici 
}

if(isset($_SESSION['id'])) {
?>
<p>
      [<?php echo htmlspecialchars($_SESSION['id_nom'], ENT_QUOTES, 'UTF-8'); ?>]
	  <a class="accueil" href="deconnexion.php">Déconnexion</a><hr />
	  	  
	<img src="image/control.gif" alt="espace membre" title="espace membre" />&nbsp;<a class="accueil" href="page_membre.php">Espace utilisateur</a><br />
	
	 
</p>
<?php } else 

{ 
    require "include/connexion.inc.php";
	echo '<br /><a class="accueil" href="creer-compte-utilisateur.php">S\'inscrire</a>';	
}
?>



Re: connexion automatique

Posté : 03 nov. 2011, 11:29
par moogli
salut,

entre les {} tu met le code qui te permet refaire une session. si cela se limite au $_SESSION['id'] c'est une "simple" copie.
Par contre il serait intéressante de vérifier que cet id est bien dans la table.
je te conseil aussi de ne pas permettre une connexion aussi simple pour les "administrateurs" parce que la y a juste a modifier le cookie et on est connecté en admin :)

Pour la logique je re renvoie à ce que xTG a déjà indiqué
Si cookie[id] existe Alors
Ouvrir connexion BDD
Récupérer dans membre les informations avec id = cookie[id]
session[id] = membre[id]
session[nom_utilisateur] = membre[nom_utilisateur]
Rafraichir page
Fin Si
@+

Re: connexion automatique

Posté : 03 nov. 2011, 12:00
par spedgreg
Je suis un debutant du coup c'est compliqué à appliquer ce qui est écrit, Sur ma page connexion.inc.php j'avais crée 2 cookie pour plus de sécurité comme ci dessous :

else
            {
                                                                                           
                     // Création des sessions
                       $_SESSION['id']=$row["id"];
                       $_SESSION['id_nom']=$row["Nom_Utilisateur"];
                                                                   
              if(isset($_POST['CB_Connexion_Automatique']))
                    {                                                                                                                                                                       
                           // Création des cookies   
                       $navigateur = (!empty($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
                        $hash_cookie = sha1('aaa'.$username.'bbb'.$password.'ccc'.$navigateur.'ddd');
                                                               
                       // Définition du temps d'expiration des cookies
                         $expiration =empty($_POST["CB_Connexion_Automatique"]) ? 0 : time() + 90 * 24 * 60 * 60;
                       
                       setcookie( 'id', $_SESSION['id'], $expiration, '/');
                         setcookie('connexion_automatique', $hash_cookie, $expiration, '/');
                       }  
                            // Redirection de l'utilisateur
                                 
                                 header("Location: page_membre.php");
           }


Et "xTG" m'a dit que un seul COOKIE suffisait donc $_COOKIE['id']

Re: connexion automatique

Posté : 03 nov. 2011, 12:36
par spedgreg
Oufff :P j'ai testé ça marche "la connexion auto" mais j'ai utilisé que un seul cookie $_COOKIE['id'] mais comme tu m'as dis " que avec un seul cookie surtout [ID] il y a juste a modifier le cookie et on est connecté en admin!
J'ai rajouté sur ma page connexion.inc.php un 2eme cookie

if(isset($_POST['CB_Connexion_Automatique']))
		{						  				   								 															        
				// Création du deuxième cookies  
                       $navigateur = (!empty($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';
                        $hash_cookie = sha1('aaa'.$username.'bbb'.$password.'ccc'.$navigateur.'ddd');
                                                               
                       // Définition du temps d'expiration des cookies
                         $expiration =empty($_POST["CB_Connexion_Automatique"]) ? 0 : time() + 90 * 24 * 60 * 60;
                       
                       setcookie( 'id', $_SESSION['id'], $expiration, '/');
                       setcookie('connexion_automatique', $hash_cookie, $expiration, '/');    // deuxième cookie
			                         
		 }

Ma page index.php
<?php if(isset($_COOKIE['id'])&& !isset($_SESSION['id_nom']))
{ 
// début de la partie que vous m'avez aidé
$result = mysql_query("
                    SELECT id, Nom_Utilisateur
                    FROM Comptes_Utilisateurs
                    WHERE id = '" . $_COOKIE['id'] . "'
               ");
	 // Récupération des données
              $row = mysql_fetch_array($result);		   
              $_SESSION['id']=$row["id"];
              $_SESSION['id_nom']=$row["Nom_Utilisateur"];
//fin de la partie        	 
}

if(isset($_SESSION['id_nom'])) {
?>
<p>
      [<?php echo htmlspecialchars($_SESSION['id_nom'], ENT_QUOTES, 'UTF-8'); ?>]
	  <a class="accueil" href="deconnexion.php">Déconnexion</a><hr />
	  	  
	<img src="image/control.gif" alt="espace membre" title="espace membre" />&nbsp;<a class="accueil" href="page_membre.php">Espace utilisateur</a><br />
	
	 
</p>
<?php } else 

{ 
    require "include/connexion.inc.php";
	echo '<br /><a class="accueil" href="creer-compte-utilisateur.php">S\'inscrire</a>';	
}
?>

Donc sur ma page index.php il y a que un seul cookie donc risque de se faire voler le cookie comment faire pour rajouter le deuxième cookie haché
  $_COOKIE['connexion_automatique']
MERCI :)

Re: connexion automatique

Posté : 03 nov. 2011, 14:15
par xTG
Enregistres un cookie contenant le hash des informations du membre.
Email et nom par exemple (plus un grain :P).
Ainsi pour vérification tu récupères l'email et le nom grâce au cookie id et tu reformes le hash.
Si le hash formé est égal au hash dans le second cookie tout est ok, sinon c'est une falsification. :)

Re: connexion automatique

Posté : 03 nov. 2011, 20:11
par spedgreg
Je viens de faire ce que tu m'a expliqué pas à pas, j'ai testé ça fonctionne :D mais pense tu que c'est ok qu'il n'y a pas de faille...? :|

ma page connexion.inc.php j'ai haché le cookie avec mot de passe + nom utilisateur avec grain
      if(isset($_POST['CB_Connexion_Automatique']))   // si l'utilisateur coche connexion auto 
	{	
	// Création des cookies  
               // hash cookie contenant  utilisateur et mot de passe avec grain

                           $hash_cookie = sha1('aaa'.$username.'bbb'.sha1($password).'ccc');
                                                               
       // Définition du temps d'expiration des cookies

                         $expiration =empty($_POST["CB_Connexion_Automatique"]) ? 0 : time() + 90 * 24 * 60 * 60;
						 
        // Création des cookies id et connexion auto

                        setcookie( 'id', $_SESSION['id'], $expiration, '/');
                        setcookie('connexion_automatique', $hash_cookie, $expiration, '/');
			                         
 }
ma page index.php tu lira les commentaires dans le code, pour la comparaison il y a plus rien à mettre à la suite? bref tu verra le code ...
<?php if(!empty($_COOKIE['id'])&& !empty($_COOKIE['connexion_automatique']) &&  empty($_SESSION['id_nom']))
{ 
                                // Sélection de l'utilisateur concerné						
$result = mysql_query("
                    SELECT id, Nom_Utilisateur, Mot_de_Passe
                    FROM Comptes_Utilisateurs
                    WHERE id = '" . $_COOKIE['id'] . "'					
                      ");
					  
					           // Récupération des données id, nom utilisateur, mot de passe
					$row = mysql_fetch_array($result);
					
					               // je reforme le hash cookie avec le nom utilisateur et mot de passe
				$hash_cookie = sha1('aaa'.$row["Nom_Utilisateur"].'bbb'.$row["Mot_de_Passe"].'ccc');
				
							// 	je le compare
                                              $_COOKIE['connexion_automatique'] == $hash_cookie;

                                                     // après la comparaison que dois-je mettre?

	 // je reforme les deux sessions
              		   
              $_SESSION['id']=$row["id"];
              $_SESSION['id_nom']=$row["Nom_Utilisateur"];
        	 
}

if(!empty($_SESSION['id_nom'])) 
{
?>
<p>
           vous êtes connecté

</p>
<?php
}
?>

Re: connexion automatique

Posté : 04 nov. 2011, 09:42
par spedgreg
Il y a plus personne pour me répondre :(

Re: connexion automatique

Posté : 04 nov. 2011, 12:14
par xTG
Ehoh, on dort nous de temps à autre. :P

Code : Tout sélectionner

SI comparaison(hash_cookie, hash_bdd) == VRAI Alors Ouvrir Session Sinon Ne rien faire ou afficher une erreur : session invalide, ect... FinSi

Re: connexion automatique

Posté : 04 nov. 2011, 13:51
par spedgreg
:D hihi j'ai la tête tellement dans les codes que j'ai du mal à dormir.

Bon j'ai codé ce que tu m'as dis de faire j'ai testé il y a pas d'erreur et ça fonctionne :P ,

dis moi si j'ai bien codé et que ma connexion auto prend bien en compte les deux cookies ['id']et['connexion_automatique'] pour pas qu'il y est une faille?

merci beaucoup de m'avoir aidé car sinon j'aurais fais des nuit blanche à réfléchir... :)

Ma page index.php

<?php if(!empty($_COOKIE['id'])&& !empty($_COOKIE['connexion_automatique']) && empty($_SESSION['id_nom']))
{ 
                                // Sélection de l'utilisateur concerné						
$result = mysql_query("
                    SELECT id, Nom_Utilisateur, Mot_de_Passe
                    FROM Comptes_Utilisateurs
                    WHERE id = '" . $_COOKIE['id'] . "'					
                      ");
					  
					           // Récupération des données id, nom utilisateur, mot de passe
					$row = mysql_fetch_array($result);
					
					               // je reforme le hash cookie avec le nom utilisateur et mot de passe
				$hash_cookie = sha1('aaa'.$row["Nom_Utilisateur"].'bbb'.$row["Mot_de_Passe"].'ccc');
				
						// 	je le compare
             if (($_COOKIE['connexion_automatique'] AND $hash_cookie) == true)
		{
	                 // Reformation des deux sessions            		   
              $_SESSION['id']=$row["id"];
              $_SESSION['id_nom']=$row["Nom_Utilisateur"];
			  
               }  
}	
if(!empty($_SESSION['id'])) {
?>
<p>
         
		   
      [<?php echo htmlspecialchars($_SESSION['id_nom'], ENT_QUOTES, 'UTF-8'); ?>]
	  <a class="accueil" href="deconnexion.php">Déconnexion</a><hr />
	  	  
	<img src="image/control.gif" alt="espace membre" title="espace membre" />&nbsp;<a class="accueil" href="page_membre.php">Espace utilisateur</a><br />
	
	 
</p>
<?php } else 

{ 
    require "include/connexion.inc.php";
	echo '<br /><a class="accueil" href="creer-compte-utilisateur.php">S\'inscrire</a>';	
}
?>

</div>

Re: connexion automatique

Posté : 04 nov. 2011, 14:54
par xTG
Il y a un risque d'injection SQL.
Regardes la fonction mysql_real_escape_string() dans la documentation. ;)

De plus le driver mysql n'est plus tenu à jour, il serait plus intéressant de passer à PDO, ou tout du moins aux fonctions mysqli (un autre driver pour le sgbd mysql mais qui lui est toujours maintenu).

Re: connexion automatique

Posté : 04 nov. 2011, 18:02
par spedgreg
J'ai entendu vaguement parlé de PDO il faut alors que je me forme :)

Sinon J'ai réussi une autre méthode pour ma connexion auto, ça fonctionne, et je pense que là qu'il n'y a plus de faille :wink:

j'ai ajouté un nouveau champs "hash_cookie" dans ma table "compte utilisateurs"

Lors de l’inscription d'un nouveau membre en plus du nom utilisateur, e-mail, .... j'enregistre ça:
$hash_cookie = mysql_real_escape_string(sha1('aaa'.$username.'bbb'.sha1($password).'ccc'));
puis sur ma page connexion c'est une include, je récupère les donnée id, hash_cookie, ... je crée mais 2 SESSIONS et si la personne coche la "connexion auto"que je crée que 1 seul COOKIE
							   
setcookie('connexion_automatique', $row["hash_cookie"], time() + 3600*24*365, '/');
sur ma page index je fais ça :

<?php if(!empty($_COOKIE['connexion_automatique']) && empty($_SESSION['id_nom']))
{ 
                                // Sélection de l'utilisateur concerné						
$result = mysql_query("
                    SELECT id, Nom_Utilisateur, Mot_de_Passe, hash_cookie
                    FROM Comptes_Utilisateurs
                    WHERE hash_cookie = '" . $_COOKIE['connexion_automatique'] . "'					
                      ");
					  
					           // Récupération des données hash cookie,id, nom utilisateur
					$row = mysql_fetch_array($result);

					// reforme le hash et le compare avec hash de la base de donée
				if(sha1('aaa'.$row["Nom_Utilisateur"].'bbb'.$row["Mot_de_Passe"].'ccc') == $row["hash_cookie"])
                 {
							   // si c'est ok je reforme les deux sessions            		   
              $_SESSION['id']=$row["id"];
              $_SESSION['id_nom']=$row["Nom_Utilisateur"];
							      
				 }	
             	                 		  
            
}	


alors que en pense tu? :D