Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP espace membre - Déconnexion ->reconnexion

Soucis de reconnexion après déconnexion d'une session en auto-connect

Sujet résolu
    2 juillet 2020 à 19:01:09

    Bonjour,

    Je commence tout juste à me former au développement web. J'ai commencé avec le cours sur html & css et j'ai suivi par le php.

    Je me retrouve sur la parti "TP espace membre". 

    Voici mon problème :

    1. Je me connecte en chochant "Connexion auto".

    2. Je me déconnecte avec le lien "Deconnexion"

    3. Je me reconnecte en cochant "Connexion auto"

    4. Et là, la page et vide.

    Je pense que le problème vient de la création de cookie mais je ne vois pas ce que ça peut-être. Mes pages de code ci-dessous :

    accueil :

    <!DOCTYPE html>
    
    <html>
    
    <head>
    
    	<title>Accueil</title>
    	<meta charset="utf-8" />
    
    </head>
    
    <body>
    
    	<h1>Bienvenur sur ce site test</h1>
    	<a href="signin.php">Inscription</a>
    	<a href="login.php">Connexion</a>
    
    </body>
    
    </html>

    login :

    <!DOCTYPE html>
    
    <html>
    
    <head>
    
    	<title>Connexion</title>
    	<meta charset="utf-8" />
    
    </head>
    
    <body>
    
    <?php
    
    	session_start();
    
    	if (!isset($_SESSION['pseudo']))
    	{
    		
    ?>
    
    	<form method="post" action="login_post.php">
    
    		<label for="pseudo"><style>#pseudo {margin-left: 60px;}</style>Pseudo: <input type="text" id="pseudo" name="pseudo" <?php if (isset($_COOKIE['pseudo'])) {echo 'value="' . $_COOKIE['pseudo'] . '"';} ?> placeholder="Votre pseudo" /></label><br /><br />
    		<label for="pass"><style>#pass {margin-left: 22px;}</style>Mot de passe: <input type="password" id="pass" name="pass" <?php if (isset($_COOKIE['password'])) {echo 'value="' . $_COOKIE['password'] . '"';} ?> /></label><br /><br />
    		<label for="auto"><style>#auto {margin-left: 5px;}</style>Connexion auto: <input type="checkbox" id="auto" name="auto" />
    		<style>#connexion {margin-left: 33px;}</style><input type="submit" name="connexion" id="connexion" value="se connecter" /></label><br /><br />
    
    	</form>
    
    <?php
    
    	}
    	else 
    	{
    
    ?>
    
    	<h1>Mon Profil</h1>
    
    	<p>
    <?php
    
    		echo 'Mon Pseudo: ' . $_SESSION['pseudo'] . '<br /><br />Mon e-mail: ' . $_SESSION['email'] . '<br /><br />';
    	}
    
    ?>
    	</p>
    	
    	<a href="deco.php">Déconnexion</a>
    
    </body>
    
    </html>

    login_post :

    <?php
    
    try
    {
    	$bdd = new PDO('mysql:host=localhost:3308;dbname=espace_membre;charset=utf8', 'root', '');
    	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch (PDOException $e)
    {
    	echo 'Erreur: ' . $e->getMessage();
    }
    
    
    $pseudo = htmlspecialchars($_POST['pseudo']);
    $hash_pass = password_hash($_POST['pass'], PASSWORD_DEFAULT);
    
    if (!empty (htmlspecialchars($_POST['pass'])) AND !empty ($pseudo))
    {
    	$req = $bdd->prepare('SELECT ID, pass, mail FROM membres WHERE pseudo = :pseudo');
    	$req->execute(array(
    	'pseudo' => $pseudo,
    	));
    
    	$resultat = $req->fetch();
    
    	$correctpass = password_verify($_POST['pass'], $resultat['pass']);
    
    	if ($resultat AND $correctpass)
    	{
    		session_start();
    
    		if (isset($_POST['auto']))
    		{
    			setcookie('pseudo', $pseudo, time() + 365*24*3600, null, null, false, true); 
    			setcookie('password', htmlspecialchars($_POST['pass']), time() + 365*24*3600, null, null, false, true);
    			setcookie('ID', $resultat['ID'], time() + 365*24*3600, null, null, false, true);
    			setcookie('email', $resultat['mail'], time() + 365*24*3600, null, null, false, true);
    			echo 'VRAI';
    
    			if (isset($_COOKIE['ID']))
    			{
    			$_SESSION['ID'] = $_COOKIE['ID'];
    			$_SESSION['pseudo'] = $_COOKIE['pseudo'];
    			$_SESSION['password'] = $_COOKIE['hash_pass'];
    			$_SESSION['email'] = $_COOKIE['email'];
    			header('location:login.php');
    			}
    
    		}
    		else
    		{
    			$_SESSION['ID'] = $resultat['ID'];
    			$_SESSION['pseudo'] = $pseudo;
    			$_SESSION['password'] = $hash_pass;
    			$_SESSION['email'] = $resultat['mail'];
    			header('location:login.php');
    		}
    
    	}
    	else
    	{	
    		echo 'Pseudo ou Mot de passe invalide';
    	}
    }
    else
    {
    	echo 'Merci d\'indiquer votre pseudo et Mot de passe.';
    }
    
    ?>

    signin :

    <!DOCTYPE html>
    
    <html>
    
    <head>
    
    	<title>Espace Membres</title>
    	<meta charset="utf-8" />
    
    </head>
    
    <body>
    
    	<form method="post" action="signin_post.php">
    
    		<label for="pseudo">Pseudo: <style>#pseudo{margin-left: 137px;}</style><input type="text" id="pseudo" name="pseudo" /></label><br /><br />
    		<label for="password">Mot de passe: <style>#password{margin-left: 99px;}</style><input type="password" id="password" name="password" /></label><br /><br />
    		<label for="password2">Retaper votre mot de passe: <style>#password2{margin-left: 10px;}</style><input type="password" id="password2" name="password2" /></label><br /><br />
    		<label for="email">e-mail: <style>#email{margin-left: 143px;}</style><input type="text" id="email" name="email" placeholder="votre adresse mail" /></label><br /><br />
    		<input type="submit" value="inscription" /><br /><br />
    
    	</form>
    
    </body>
    
    </html>

    signin_post :

    <?php
    
    try
    {
    	$bdd = new PDO('mysql:host=localhost:3308;dbname=espace_membre;charset=utf8', 'root', '');
    	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch (PDOException $e)
    {
    	echo 'Erreur: ' . $e->getMessage();
    }
    if (!empty($_POST['pseudo']) AND !empty($_POST['password']) AND !empty($_POST['password2']) AND !empty($_POST['email']))
    	{
    
    		$pseudo = htmlspecialchars(trim($_POST['pseudo']));
    		$email = htmlspecialchars(trim($_POST['email']));
    		$pass = password_hash($_POST['password'], PASSWORD_DEFAULT);
    		$pass2 = password_hash($_POST['password2'], PASSWORD_DEFAULT);
    
    		if (preg_match("#^[a-zA-Z0-9._-]{2,}@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#", $email))
    		{
    			$req = $bdd->query("SELECT mail FROM membres WHERE mail = '$email'");
    			$count = $req->rowcount();
    			if ($count == 0)
    			{
    				if(password_verify($_POST['password'], $pass2))
    				{
    					$req1 = $bdd->query("SELECT ID, pseudo FROM membres WHERE pseudo = '$pseudo'");
    					$count = $req->rowcount();
    					$resultat = $req1->fetch();
    					if ($count == 0)
    					{
    						$req2 = $bdd->prepare('INSERT INTO membres(pseudo, pass, mail, date_inscription) VALUES(:pseudo, :pass, :mail, NOW())');
    						$req->execute(array(
    						'pseudo' => $pseudo,
    						'pass' => $pass,
    						'mail' => $email,
    						));
    
    						session_start();
    
    						$_SESSION['pseudo'] = $pseudo;
    						$_SESSION['email'] = $email;
    
    						header('location:login.php');
    
    					}
    					else
    					{
    						echo 'Pseudo déjà utilisé, merci d\'en choisir un autre.';
    					}
    				}
    				else
    				{
    					echo 'Les mot de passe ne sont pas identiques';
    				}
    			}
    			else
    			{
    				echo 'Cet email est déjà utilisé.';
    		 	}
    		}
    		else
    		{
    			echo 'Veuillez rentrer une adresse mail valide.';
    		}
    		
    	}
    	else
    	{
    		echo 'Veuillez remplir tous les champs.';
    	}
    
    ?>

    index :

    <?php
    
    session_start();
    
    ?>
    
    <!DOCTYPE html>
    
    <html>
    
    <head>
    
    	<title>Mon Profil</title>
    	<meta charset="utf-8" />
    
    </head>
    
    <body>
    
    	<h1>Mon Profil</h1>
    	<p>
    
    <?php
    
    echo 'Mon pseudo: ' . $_SESSION['pseudo'] . '<br /><br />';
    echo 'Mon email: ' . $_COOKIE['email'] . '<br /><br />';
    
    ?>
    	</p>
    	<a href="deco.php">Déconnexion</a>
    
    </body>
    
    </html>

    deco :

    <?php
    
    session_start();
    
    $_SESSION = array();
    session_destroy();
    
    setcookie('pseudo', ''); 
    setcookie('password', '');
    setcookie('ID', '');
    setcookie('email', '');
    header('location:accueil.php');
    
    ?>


    Merci de ne pas trop me juger sévèrement si vous voyez de GROSSES erreurs mais plutôt de m'en faire part.

    Merci :).


    • Partager sur Facebook
    • Partager sur Twitter
      2 juillet 2020 à 20:18:58

      Bonjour,

      Alors déjà, on vire tous ces htmlspecialchars qui s'utilisent uniquement à l'affichage (cf signature)

      "Location: index.php" et non "location:index.php" certes ça fonction en local mais en ligne, c'est 1 chance sur 2 que ça plante

      Tu fais un password_hash de $pass et $pass2 (utilité ?) car les deux seront forcément différent

      Pas de rowCount sur un SELECT, vérifie directement le fetch dans le if

      Revois la doc de password_verify, car il y a mdp en clair de $_POST et le mdp hashé de la BDD

      Prepare la requête SELECT sur le pseudo (tu le fais très bien pour le reste alors ici aussi)

      Le cookie ne stocke pas le mdp

      • Partager sur Facebook
      • Partager sur Twitter
        3 juillet 2020 à 18:42:48

        Bonjour,

        Merci beaucoup pour ton aide :D.

        :euh: J'ai corrigé ses erreurs, mais malgré cela, le problème persiste.

        Concernant le "password_verify", je compare bien que le mot de passe en clair fourni correspond bien au mot de passe hashé fournit dans la BDD. La doc indique qu'on vérifie un mot de passe par rapport à un hashage.

        C'est le fait qu'il soit issu de la BDD qui gêne ?

        -
        Edité par Romcode 3 juillet 2020 à 18:43:19

        • Partager sur Facebook
        • Partager sur Twitter
          4 juillet 2020 à 8:18:05

          C'est la confirmation du mot de passe à retaper lors de l'inscription mais je l'ai modifié.

          Comme tu me l'a fait remarqué, je n'ai hashé le mot de passe qu'une fois et je l'ai vérifié (password_verify) avec la confirmation du mot de passe :

          $pass = password_hash($_POST['password'], PASSWORD_DEFAULT);
          
          if(password_verify($_POST['password2'], $pass))sdfsdf
          				{
          					$req1 = $bdd->prepare('SELECT ID, pseudo FROM membres WHERE pseudo = :pseudo');
          					$req1->execute(array(
          						'pseudo' => $_POST['pseudo']
          					));


          password2 étant la confirmation.

          -
          Edité par Romcode 4 juillet 2020 à 8:19:08

          • Partager sur Facebook
          • Partager sur Twitter
            4 juillet 2020 à 11:08:13

            bah justement, le second c'est le mdp hashé de la BDD qu'il faut.
            • Partager sur Facebook
            • Partager sur Twitter
              5 juillet 2020 à 9:49:28

              Lors de la connexion je vérifie bien la conformité du mot de passe renseigné avec le mot de passe de la BDD:

              $hash_pass = password_hash($_POST['pass'], PASSWORD_DEFAULT);
              
              if (!empty ($_POST['pass']) AND !empty ($_POST['pseudo']))
              {
              	$req = $bdd->prepare('SELECT ID, pass, mail FROM membres WHERE pseudo = :pseudo');
              	$req->execute(array(
              	'pseudo' => $_POST['pseudo'],
              	));
              
              	$resultat = $req->fetch();
              
              	$correctpass = password_verify($_POST['pass'], $resultat['pass']);
              
              	if ($resultat AND $correctpass)
              	{
              		session_start();

              Mais par contre, lors de l'inscription je ne peux comparer le mot de passe fournit une première fois qu'avec celui de la vérification, une deuxième fois:

              $pass = password_hash($_POST['password'], PASSWORD_DEFAULT);
              if(password_verify($_POST['password2'], $pass))
              				{
              					$req1 = $bdd->prepare('SELECT ID, pseudo FROM membres WHERE pseudo = :pseudo');
              					$req1->execute(array(
              						'pseudo' => $_POST['pseudo']
              					));
              					$resultat1 = $req1->fetch();



              • Partager sur Facebook
              • Partager sur Twitter
                5 juillet 2020 à 9:52:04

                Lors de l'inscription. Tu vérifies que les deux mdp en clair sont identiques et ensuite tu fais un hash sur l'un des deux.

                Pas de password_verify à l'inscription 

                • Partager sur Facebook
                • Partager sur Twitter
                  6 juillet 2020 à 8:40:49

                  Ah oui, c'est vrai que c'est plus simple de cette manière. Merci pour ton aide. :).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 juillet 2020 à 12:26:36

                    Avec plaisir. Passe ton sujet en résolu
                    • Partager sur Facebook
                    • Partager sur Twitter

                    TP espace membre - Déconnexion ->reconnexion

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown