Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer identifiant et mdp dans base de données

    23 avril 2017 à 10:36:29

    Bonjour,

    j'aimerais créer une page web "se connecter" à partir de laquelle un utilisateur pourrait se connecter après s'être inscrit (ses données se trouvent donc dans une base de données). Voici mon code :

    	<?php
    
    		$ConnexionBD = mysqli_connect("localhost", "root", "", "projet_techno_web") ;
    
    		if (mysqli_connect_errno()) 
    		{
    			echo '<p class="erreur">Erreur de connection</p>' . mysqli_connect_error();
    			return;
    		}
    
    		$verif = '0';
    		$pwd_valide = 'default';
    
    		if (isset($_POST['email']) && isset($_POST['motdepasse'])) 
    		{
    
    			$Email		= htmlentities($_POST['email'], ENT_QUOTES);
    
    			$Requete1="SELECT email FROM inscription";
    	
    			$login_valide = mysqli_query($ConnexionBD, $Requete1);
    			
    			foreach($login_valide as $row)
    			{
    
    				if ($Email == $row)
    				{
    					$Requete2="SELECT motdepasse FROM inscription WHERE email=$Email";
    	
    					$Resultat2 = mysqli_query($ConnexionBD, $Requete2);
    					
    					$pwd_valide = mysqli_fetch_array($Resultat2);
    
    					$verif = '1';
    
    				}
    
    			}
    
    			if ($verif='0')
    			{
    				echo '<body onLoad="alert(\'Membre non reconnu\')">';
    			}
    
    			if ($pwd_valide == $_POST['motdepasse']) 
    			{
    				session_start ();
    
    				$_SESSION['email'] = $_POST['email'];
    				$_SESSION['motdepasse'] = $_POST['motdepasse'];
    
    				header ('location: redirection_se_connecter.php');
    
    			}
    			else 
    			{
    				echo '<body onLoad="alert(\'Mot de passe incorrect\')">';
    			}
    		}
    		
    
    	?>


    Quoi que je rentre dans mon formulaire de connection (adresse mail correcte ou non, mdp correct ou non), c'est toujours le même message qui s'affiche : "mot de passe incorrect".

    Voyez-vous d'où vient mon erreur ?

    Merci d'avance,

    Héloïse

    • Partager sur Facebook
    • Partager sur Twitter
      23 avril 2017 à 11:04:59

      Lut,

      En relisant ton code, je remarque un bug potentiel (ligne 40):

       if ($verif='0')
      {
          echo '';
      }
      

      Le simple égal signifie une affectation de variable et non pas une égalité qui est signifié par un double égal (==).

      La ligne 26 m'interpelle: essayes-tu de comparer un array avec un string ? Si c'est le cas, l'égalité ne sera jamais vérifiée. Même avec deux strings comparés, l'égalité peut ne jamais être vérifiée puisque les apostrophes que tu auras encodés seront aussi pris en compte dans la comparaison.

      Une petite remarque concernant le code, à toi de voir si tu veux la prendre en compte ou pas: Pourquoi tu prends toutes les adresses email dans la base de données, pour ensuite boucler dessus et trouver tous les mots de passe ? À ta place, j'aurais combiné les deux et fait un WHERE sur l'adresse email et le mot de passe. Le résultat est très simple: si il y a quelque chose, c'est bon.

      Bon débuggage,

      ++

      • Partager sur Facebook
      • Partager sur Twitter
      Clef PGP: 4577 D41D 2F68 4552 ou https://keybase.io/l4p1n; Votre problème est résolu ? Mettez-le en résolu pour nous aider à nous retrouver ^^
        23 avril 2017 à 11:48:55

        Un peu compliqué ce code. Je te conseille de prendre un papier et un crayon et de raisonner par etape ....

        Que faire avec les entrées ?

        Comment sécuriser ma page ?

        Que faire si les entrées sont vides ou invalides ?

        Autant de question auquel il faut réfléchir avant de se lancer pour obtenir un code qui marche du premier coup.

        Quand tu code, fais des test des que tu as ecrit 2 lignes. Ca permet de debugger rapidement et de savoir qu'est-ce qui bug et ne pas partir dans des variables inutiles tel que $verif ......

        • Partager sur Facebook
        • Partager sur Twitter
          23 avril 2017 à 12:55:06

          lapin-math a écrit:

          Lut,

          En relisant ton code, je remarque un bug potentiel (ligne 40):

           if ($verif='0') { echo ''; } 

          Le simple égal signifie une affectation de variable et non pas une égalité qui est signifié par un double égal (==).

          La ligne 26 m'interpelle: essayes-tu de comparer un array avec un string ? Si c'est le cas, l'égalité ne sera jamais vérifiée. Même avec deux strings comparés, l'égalité peut ne jamais être vérifiée puisque les apostrophes que tu auras encodés seront aussi pris en compte dans la comparaison.

          Une petite remarque concernant le code, à toi de voir si tu veux la prendre en compte ou pas: Pourquoi tu prends toutes les adresses email dans la base de données, pour ensuite boucler dessus et trouver tous les mots de passe ? À ta place, j'aurais combiné les deux et fait un WHERE sur l'adresse email et le mot de passe. Le résultat est très simple: si il y a quelque chose, c'est bon.

          Bon débuggage,

          ++

          Faire un WHERE sur un mot de passe c'est la pire des failles de sécurité.

          • Partager sur Facebook
          • Partager sur Twitter
            23 avril 2017 à 13:24:06

            Merci pour vos remarques.

            Voici la structure du programme en "français" :

            - connexion à la base de données

            - si le formulaire de connexion est rempli, je vérifie que l'adresse mail (qui sert d'identifiant) existe dans ma base de données. Et pour cela, je n'ai rien trouvé de plus simple que de prendre les adresses mail de la base de données et de les comparer à celle entrée.

            - si l'adresse mail entrée existe dans la base de données, je prends le mot de passe associé à cette adresse mail dans la base de données et je le compare à celui entré dans le formulaire

            - si les deux sont identiques, l'utilisateur est connecté

            Il me semble que $verif n'est pas une variable inutile puisqu'elle permet de savoir si l'adresse se trouve ou non dans la base de données.

            Pour la ligne 26, je compare l'adresse mail entrée par l'utilisateur avec chacune des adresses mails de la base de données. Du moins, c'est ce que j'essaie de faire. Donc si c'est bien ça, je compare un string avec un string.

            J'ai changé le "=" en "==" de la ligne 40 (faute d’inattention !), et c'est maintenant le message d'erreur "membre non reconnu" qui s'affiche à chaque fois, ce qui est plus cohérent. Car en effet, je pense que je m'embrouille en faisant appel à toutes les adresses mail de ma base de données... En fait, je ne sais pas bien comment les récupérer sous forme de liste ?

            • Partager sur Facebook
            • Partager sur Twitter
              23 avril 2017 à 22:26:51

              Nephthys a écrit:

              lapin-math a écrit:

              Lut,

              En relisant ton code, je remarque un bug potentiel (ligne 40):

               if ($verif='0') { echo ''; } 

              Le simple égal signifie une affectation de variable et non pas une égalité qui est signifié par un double égal (==).

              La ligne 26 m'interpelle: essayes-tu de comparer un array avec un string ? Si c'est le cas, l'égalité ne sera jamais vérifiée. Même avec deux strings comparés, l'égalité peut ne jamais être vérifiée puisque les apostrophes que tu auras encodés seront aussi pris en compte dans la comparaison.

              Une petite remarque concernant le code, à toi de voir si tu veux la prendre en compte ou pas: Pourquoi tu prends toutes les adresses email dans la base de données, pour ensuite boucler dessus et trouver tous les mots de passe ? À ta place, j'aurais combiné les deux et fait un WHERE sur l'adresse email et le mot de passe. Le résultat est très simple: si il y a quelque chose, c'est bon.

              Bon débuggage,

              ++

              Faire un WHERE sur un mot de passe c'est la pire des failles de sécurité.



              Que faut-il faire dans ce cas ?
              De toute facon, le mot de passe doit être hacher ...

              Il faudrait aussi utiliser une regex pour determiner si c'est bien un email.

              Ensuite avec rowCount(), on récupére le nombre de ligne ayant cette email.

              Si la fonction renvoie 1, alors on compare les mdp haché.

              -
              Edité par CédricFARINAZZO 23 avril 2017 à 22:52:11

              • Partager sur Facebook
              • Partager sur Twitter
                23 avril 2017 à 22:40:59

                CédricFARINAZZO a écrit:

                Nephthys a écrit:

                lapin-math a écrit:

                Lut,

                En relisant ton code, je remarque un bug potentiel (ligne 40):

                 if ($verif='0') { echo ''; } 

                Le simple égal signifie une affectation de variable et non pas une égalité qui est signifié par un double égal (==).

                La ligne 26 m'interpelle: essayes-tu de comparer un array avec un string ? Si c'est le cas, l'égalité ne sera jamais vérifiée. Même avec deux strings comparés, l'égalité peut ne jamais être vérifiée puisque les apostrophes que tu auras encodés seront aussi pris en compte dans la comparaison.

                Une petite remarque concernant le code, à toi de voir si tu veux la prendre en compte ou pas: Pourquoi tu prends toutes les adresses email dans la base de données, pour ensuite boucler dessus et trouver tous les mots de passe ? À ta place, j'aurais combiné les deux et fait un WHERE sur l'adresse email et le mot de passe. Le résultat est très simple: si il y a quelque chose, c'est bon.

                Bon débuggage,

                ++

                Faire un WHERE sur un mot de passe c'est la pire des failles de sécurité.



                Que faut-il faire dans ce cas ?
                De toute facon, le mot de passe doit être hacher ...

                Il faudrait aussi utiliser une regex pour determiner si c'est bien un email.

                Ensuite avec rowCount(), on récupére le nombre de ligne ayant cette email.

                Si la fonction renvoie 1, alors oncompare les mdp hachéo

                -
                Edité par CédricFARINAZZO il y a 9 minutes

                En cas d'injection SQL il suffit de faire un OR 1=1 et dans ce cas on s'en fiche que ton mot de passe est correct ou non.

                • Partager sur Facebook
                • Partager sur Twitter
                  23 avril 2017 à 22:53:07

                  Oui mais si le mot de passe est haché ....
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 avril 2017 à 23:16:37

                    Oui mais à partir du moment où tu as une injection SQL on s'en fiche que ton mot de passe soit haché puisque l'utilisateur sera connecté quoi qu'il arrive, et que OSEF il aura accès à toutes la BDD. Donc non, on ne s'en fout pas.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 avril 2017 à 23:33:33

                      Que faut-il faire dans ce cas ?
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Récupérer identifiant et mdp dans base de données

                      × 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