php connexion

Suivre ce topic
Ce topic est suivi par : nanou
Ce topic a été résolu
nanou

nanou Le 10 février 2018 à 23:02 (Édité le 25 janvier 2019 à 17:54)

Bonjours/Bonsoir, je suis un élève de terminal STI2D et j'ai un projet qui a pour but de créer une IHM sur un site web, j'ai commencé par créer la page d'authentification et j'ai regardé les vidéo "TUTO PHP - Créer un espace membre 1/3 (inscription)" et  "TUTO PHP - Créer un espace membre 2/3 (profil, connexion)"
mais je bloque depuis des heures à une partie de la connexion, j'ai essayé de suivre tout ce que primfx faisait pour toujours être au même niveau en enlevant juste les données que je n'avais pas besoin comme le mail ou le pseudo (C'est dans le cahier des charges, je dois mettre qu'un mot de passe). Mais au bout d'un moment, lorsqu'il faut appuyer sur le bouton et qu'il met "veuillez saisir du texte" ça ne marche pas, je me suis dis que ce n'était pas une étape forcément très importante donc je l'ai passé mais tout le reste ne marche pas non plus et je bloque dessus depuis un long moment donc si jamais quelqu'un a une solution...
PrimFX

PrimFX Le 10 février 2018 à 23:34

Bonsoir @nanou,
Pourrais-tu nous envoyer ton code dans un prochain message à l'aide du bouton prévu à cet effet dans l'éditeur du forum (histoire que le code apparaisse bien formaté et coloré) ainsi que quelques captures d'écran de ta base de données (ou du moins des tables de ta bdd qui sont en rapport avec le soucis que tu rencontres) ?
Cela nous permettrait de mieux cerner le problème pour y trouver une solution 😉
nanou

nanou Le 11 février 2018 à 11:30

<?php
$bdd = new PDO('mysql:host=localhost;dbname=projet', 'root', 'root');
if (isset($_POST['formco'])) 
{
   
   $mdpconnect = sha1($_POST['mdpconnect']);
   if (!empty($mdpconnect)) 
   {
   }
   else
   {
      $erreur = "Saisir le mot de passe";
   }
}
?>
<html>
   <head>
      <title>IHM login</title>
      <meta charset="utf-8">
      <link rel="stylesheet" type="text/css" href="index.css">
   </head>
   <body>
      <div class="barre">
         <a href="http://www.lycee-branly.fr/" target="_blank">
         <img src="http://image-parcours.copainsdavant.com/image/750/1688574933/4193568.jpg" alt="BRANLY" width="15%" height="75%" border="0"/>
         </a>
      </div>
      <div align="center">
         <br /><br /><br />
         <div class="login">
            <form method="POST" action="">
               <div class="txt">
                  
                  <table>      
                     <tr>
                           <td><font color="#fff">Mot de passe :  </font></td>
                     </tr>   
                        
                     <tr>
                        <td>      
                              <input type="password" placeholder=" Mot de passe"  name="mdpconnect">
                        </td>   
<br /><br />
                        <td>   
                              <input type="submit" value="Connection" name="formco">
                        </td>   
                  </table>      
                  
               </div>
            </form>
            <?php
               if (isset($erreur)) 
               {
                  echo $erreur;
               }
            ?>
         </div>
      </div>
   </body>
nanou

nanou Le 11 février 2018 à 11:34

nanou

nanou Le 11 février 2018 à 11:36

Je viens de m'inscrire sur PrimFx, je ne sais pas si c'est comme ça que je devais faire, merci beaucoup de ton aide en tout cas
PrimFX

PrimFX Le 11 février 2018 à 12:48

Pas de soucis, effectivement c'est bien comme ça qu'il fallait envoyer tout ça (code / screenshot), ç'aurait été cool de tout mettre dans un seul message mais pas de soucis 😋

Dans le cas de ton code en fait, il faut prendre un truc en compte : as-tu besoin d'un seul mot de passe valide pour accéder au site ? ou bien tu peux utiliser un nombre limité de mots de passe (comme 3, 4, 5 ou 6) ou bien ton code doit obligatoirement être lié à une base de données pour tenter de se connecter avec un des mots de passe disponibles dans ta table "membres" ?

Cela permettra de savoir si tu as effectivement besoin de passer obligatoirement par une base de données ou non (d'ailleurs est-ce que l'utilisation d'une bdd est obligatoire dans le cahier des charges de ton projet ?). Je m'explique : passer par une bdd est toujours une bonne solution quand il s'agit de récupérer des informations propres à un membre (qu'on identifiera généralement par un couple identifiant / mot de passe où l'identifiant peut par exemple être un pseudo unique ou bien son adresse mail). Dans le cas où tu as juste besoin d'un mot de passe, tu pourrais faire la vérification sans passer par une base de données mais juste en vérifiant si le mot de passe une fois haché correspond bien à celui indiqué dans ta condition directement dans le script PHP 😉
nanou

nanou Le 11 février 2018 à 13:11

Oui dans le cahier des charge je suis obligé de passer par une base de donnée et il ne doit y avoir qu'un mot de passe à entrer pour le site.
Comme j'avais juste besoin de créer une page de connexion qui nous emmène au site principal j'avais commencé par regardé ta deuxième vidéo mais comme j'étais bloqué je me suis dis que j'allais créer une page d'inscription ou il n'y aurait que le mot de passe à mettre et ensuite j'allais supprimer la page une fois que le compte aurait été créé (tu dois peut être te dire que c'était inutile mais étant donné que la connexion ne marchait pas je pensais que tout les détails étaient fautifs y compris le fait que le mot de passe n'était pas en "sha1") au moins maintenant j'ai le mot de passe mieux protégé mais bon ça n'a pas arrangé mon problème. Tout à l'heure j'ai réessayé sur la page de connexion et j'ai l'impression que le problème vient du "else" ou du "!empty" y a toujours des problèmes sur ça.
PrimFX

PrimFX Le 11 février 2018 à 14:12 (Édité le 11 février 2018 à 15:13)

Très bien, dans ce cas le code suivant devrait te permettre de traiter ton formulaire sans soucis :
<?php
$bdd = new PDO('mysql:host=localhost;dbname=projet', 'root', 'root');if (isset($_POST['formco'])) {
if (!empty($_POST['mdpconnect'])) 
{
   $mdpconnect = sha1($_POST['mdpconnect']);
   // On tente de récupérer le champ de la bdd où le mot de passe (déjà en sha1 dans la bdd) correspond bien au mot
   // de passe entré dans le champ du formulaire
   $req = $bdd->prepare('SELECT * FROM membre WHERE motdepasse = ?');
   $req->execute(array($mdpconnect));
   if ($req->rowCount()) // On effectue un rowCount() qui permet de voir si un (ou plusieurs) champ a bien été trouvé ou non avec ce mot de passe
   {
      // Ici le mot de passe est valide, tu peux donc effectuer ce que tu veux pour connecter l'utilisateur, comme créer une variable de session spécifique par exemple
   }
   else
   {
      // Si le rowCount() retourne 0, il est considéré comme false et donc cela signifie qu'aucun champ n'a été trouvé avec le mot de passe indiqué
      $erreur = "Le mot de passe saisi est invalide";
   }
}
else
{
   $erreur = "Saisir le mot de passe";
}
?>
A noter que j'ai ici modifié dans ton traitement la vérification avec le !empty(). En effet, !empty() te permettra de vérifier si une chaîne contient bien quelque chose. Le problème est que lorsque tu fais un sha1() sur une chaîne de caractères même vide, sha1() te renverra toujours une chaîne de caractères de 32 bits (il me semble, en tout cas jamais une chaîne vide). Si tu veux vérifier que l'utilisateur a donc bien renseigné un mot de passe dans ton formulaire, tu seras donc obligé de faire un !empty() directement sur la variable poste et seulement ensuite de le hacher en sha1() (comme dans mon exemple ci-dessus).

Le fait de mettre le mot de passe en sha1 n'est pas censé changer quelque chose au fonctionnement du traitement, du moment que les mots de passe sont hachés de la même façon dans ta bdd. Par exemple si dans ta bdd tu insères un mot de passe du style "1234" sans hachage (en clair), tu pourras utiliser le même traitement sauf que $mdoconnect sera directement égal à ta variable POST, sans passer par du sha1. Dans le cas contraire, si tu utilises dans ton script de traitement du sha1, alors il faudra que le ou les mots de passe insérés dans ta bdd aient été auparavant hachés en sha1. D'ailleurs si jamais tu veux hacher une chaîne de caractères pour l'insérer comme mot de passe en sha1 dans ta bdd tu peux juste faire un mini script du style :
<?php echo sha1("tonmotdepasse"); ?>
Et tu auras ensuite juste à insérer l'affichage du echo dans ta table "membre", au lieu d'avoir à passer par tout un formulaire d'inscription.

Cela dit les mots de passe en clair sont normalement entièrement à bannir dans une bdd, en sha1 c'est très limite actuellement avec tous les dictionnaires de dé-hachage qui existent, bref la meilleure solution reste d'utiliser les fonctions password_hash et password_verify de PHP qui sont à ce jour très bien sécurisées. Cela dit tu es ici dans le cadre d'un TP de cours, possible donc que le fait que tes mots de passe soient en clair ou hachés de quelconque façon n'ait aucun impact... 😋

Voilà, en espérant avoir pu t'aider, dis-moi si c'est bien ce que tu voulais mettre en place 😉
nanou

nanou Le 11 février 2018 à 14:26

D'accord comme tu dis je vais faire un mot de passe normal vu que ce n'est qu'un projet de cours, je vais essayé le code que tu m'as montré en espérant que je finisse enfin mon travail, sinon merci infiniment, j'en ai appris plus avec toi qu'avec mes cours
PrimFX

PrimFX Le 11 février 2018 à 14:34

Pas de soucis 😉 Si tu utilises un mot de passe en clair n'oublie juste pas d'enlever le sha1() dans ton traitement !
PS : J'ai déplacé ton topic dans "Programmation" > "PHP" qui est plus approprié 😉
nanou

nanou Le 11 février 2018 à 15:11

Euh... C'est assez gênant, je rencontre plein de problèmes sur les codes et je ne sais pas m'en débarrasser comme une erreur à la dernière ligne sur le </html>, j'ai mis ce caractère pour m'en débarrasser temporairement "}" à la fin du code php et il y a encore un problème sur la ligne 10 "$req = $this->db->prepare('SELECT * FROM membre WHERE motdepasse = ?');" où on me dit " Fatal error: Using $this when not in object context in C:\UwAmp\www\IHM\connection.php on line 10"
Ca m'embête vraiment de te demander de m'aider dans tout ça je te prie de m'excuser..
PrimFX

PrimFX Le 11 février 2018 à 15:16

Le forum est là pour ça 😋
Pour le problème d'accolades, vérifie tous tes "if", "elseif" et "else", il doit y avoir une accolade qui manque quelque part 😉
Pour l'autre bug avec le $this->db c'est de ma faute, j'ai tapé mon message trop vite avec l'habitude de l'Orienté Objet. J'ai édité mon message plus haut, il faut que tu rempalces $this->db par $bdd
nanou

nanou Le 11 février 2018 à 15:22

Ca marche enfin !!! Tu ne sais pas à quelle point je suis heureux j'ai envie de pleurer 😭😭 J'ai passé ma journée hier et là ça fonctionne enfin !! Merci vraiment tu es génial !
PrimFX

PrimFX Le 11 février 2018 à 15:41

De rien 😃
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte