authentification PHP HTML

authentification PHP HTML - PHP - Programmation

Marsh Posté le 30-03-2009 à 16:39:20    

Bonjour,
Je travaille actuellement sur le développement d'une page web permettant l'authentification d'utilisateurs.
Voici le code de la page HTML :
 
<html><head><title>Gestion des utilisateurs</title></head>
<body background="images/fond.gif" vlink="gray" alink="red" link="gray">
<h4>Pour vous identifier, veuillez entrer votre login :</h4>
 
<FORM method="post" action="login1.php" name=form>
<TABLE BORDER=0 align="center">
<TR>
 <TD>Login :</TD>
 <TD>
 <INPUT type=text name="nom" size=30> </TD>
</TR>
 
<TR>
 <TD>Mot de passe :</TD>
 <TD>
 <INPUT name="passwd" type=password size="30"> </TD>
</TR>
<TR>
 <TD COLSPAN=2>
 <br> </TD>
</TR>
 
<TR>
 <TD COLSPAN=2><div align="center">
   <input type="image" src="images/valider.jpg" onClick="javascript:document.form.submit();" name="send">
 </div></TD>
</TR>
</TABLE>
</FORM>
</body>
</html>
 
 
 
Et celui de la page en PHP :
<HTML><HEAD><TITLE>Gestion des utilisateurs</TITLE>
</HEAD>
<BODY background="images/fond.gif" vlink="gray" alink="red">
<p>
 
<?php
//$id_file=fopen("utilisateurs.txt","r" );
//{
if(isset($_POST["nom"]) && isset($_POST["passwd"]))
{
    $nom=$_POST["nom"];
    $passwd=$_POST["passwd"];
    $chaine=$nom.":".$passwd;
   
    //$i=1;
      if($id_file=fopen("utilisateurs.txt","r" ))
      {
       while($ligne=fread($id_file,100))
       {
        if($ligne==$chaine)
   {
    echo "Acc&egrave;s autoris&eacute;. <br>";  
    echo "<a href=\"accueil.html\"><img src=\"images/quitter.jpg\"></a>";
   }
   else
   {
      echo "<b>Acc&egrave;s refus&eacute; !</b>\n<br>Assurez vous que votre login et mot                    de passe sont valides.<br>";
      echo "<br><hr><br><a href=\"index1.html\"><img src=\"images/retour.jpg\"></a><br>";
     // echo $chaine;
      exit();
      }
     } //fin du while
  fclose($id_file);
   }
   else
   {
  echo "Fichier inexistant";
   }
}
else
{  
 echo "<h2>Veuillez vous authentifier !</h2> ";
}
?>
 
 
Le fichier utilisateurs.txt contient les lignes suivantes :
admin:toto
titi:tutu
 
Et lorsque j'exécute le programme (page HTML), il me met toujours accès refusé.
Merci de m'aider.

Reply

Marsh Posté le 30-03-2009 à 16:39:20   

Reply

Marsh Posté le 30-03-2009 à 17:15:45    

fread() est fait pour lire des enregistrements de longueur fixe, ce qui n'est pas le cas ici.
Il vaut mieux utiliser fgets() qui va ramener une chaine jusquà la fin de la ligne.
Voir la doc http://fr.php.net/manual/fr/function.fgets.php
 
(Pour les prochains messages sur ce forum, sélectionner les lignes de code et appuyer sur le bouton "Fixe" ou "C/c++". Cela mettra le code dans un cadre plus lisible).


Message édité par olivthill le 30-03-2009 à 17:16:17
Reply

Marsh Posté le 30-03-2009 à 17:32:37    

J'ai fait une modification du fichier PHP :

Code :
  1. <HTML><HEAD><TITLE>Gestion des utilisateurs</TITLE>
  2. </HEAD>
  3. <BODY background="images/fond.gif" vlink="gray" alink="red">
  4. <p>
  5. <?php
  6. //$id_file=fopen("utilisateurs.txt","r" );
  7. //{
  8. if(isset($_POST["nom"]) && isset($_POST["passwd"]))
  9. {
  10.    $nom=$_POST["nom"];
  11. $passwd=$_POST["passwd"];
  12. $chaine=$nom.":".$passwd;
  13. echo "nom = " .$nom. "<br>";
  14. echo "password = " .$passwd. "<br>";
  15. echo "chaine =" .$chaine. "<br>";
  16.     //$i=1;
  17.         $id_file=fopen("utilisateurs.txt","r" );
  18.        while($ligne=fgets($id_file,100))
  19.        {
  20.   echo $ligne;
  21.         if($ligne==$chaine)
  22.   {
  23.    echo "Acc&egrave;s autoris&eacute;. <br>";
  24.    echo "<a href=\"accueil.html\"><img src=\"images/quitter.jpg\"></a>";
  25.    //echo $chaine;
  26.   }
  27.   else
  28.   {
  29.      echo "<b>Acc&egrave;s refus&eacute; !</b>\n<br>Assurez vous que votre login et mot                    de passe sont valides.<br>";
  30.      echo "<br><hr><br><a href=\"index1.html\"><img src=\"images/retour.jpg\"></a><br>";
  31.      //echo $chaine;
  32.      exit();
  33.      }
  34.      } //fin du while
  35.  fclose($id_file);
  36. }
  37. else
  38. {
  39. echo "<h2>Veuillez vous authentifier !</h2> ";
  40. }
  41. ?>


 
Voici le résultat lorsque je saisis admin en login et toto en mot de passe :
nom = admin
password = toto
chaine =admin:toto
admin:toto Accès refusé !
Assurez vous que votre login et mot de passe sont valides.
 
Il me met toujours accès refusé alors que ces valeurs sont présentes dans le fichier utilisateurs.txt.
Merci de m'aider

Reply

Marsh Posté le 30-03-2009 à 17:35:02    

Salut,
Essai ça :
 
if(trim($ligne) == $chaine) au lieu de if($ligne==$chaine)

Reply

Marsh Posté le 30-03-2009 à 17:37:35    

Merci yellu.
Sauf que maintenant, il m'affiche ça :
nom = admin
password = toto
chaine =admin:toto
admin:toto Accès autorisé.
titi:tutu
Accès refusé !
Assurez vous que votre login et mot de passe sont valides.
 
Il y a sûrement des éléments à supprimer ou qqch à ajouter.


Message édité par colombat le 30-03-2009 à 17:38:49
Reply

Marsh Posté le 30-03-2009 à 17:44:26    

ben oui met un "break;" apres avoir trouvé un enregistrement qui corresponde pour casser ton while.
 
Ton else est pas bon car actuellement tu casses la boucle avec exit(); des qu'un enregistrement est mauvais, on peut donc pas s'identifier avec autre chose que la première ligne de ton fichier ...
 
Utilises un boolean que tu passe a true dans ta boucle en cas de succes et que tu vérifie une fois la boucle terminée ou cassée.
 
Yellu

Reply

Marsh Posté le 30-03-2009 à 18:07:57    

Tu n'aurais pas un exemple, Yallu ?
Sinon merci de réadapter mon code avec le booléen. ;)

Reply

Marsh Posté le 31-03-2009 à 10:20:30    

Code :
  1. <HTML><HEAD><TITLE>Gestion des utilisateurs</TITLE>
  2. </HEAD>
  3. <BODY background="images/fond.gif" vlink="gray" alink="red">
  4. <p>
  5. <?php
  6. if(isset($_POST["nom"]) && isset($_POST["passwd"]))
  7. {
  8.    $nom = $_POST["nom"];
  9.    $passwd = $_POST["passwd"];
  10.    $chaine = $nom . ":" . $passwd;
  11.    $id_file = fopen("utilisateurs.txt", "r" );
  12.    $auth = false;
  13.    while ($ligne = fgets($id_file, 100))
  14.    {
  15.        if ($ligne == $chaine)
  16.        {
  17.             $auth = true;
  18.             break;
  19.        }
  20.    } //fin du while
  21.    fclose($id_file);
  22.  
  23.    if ($auth)
  24.    {
  25.        echo "Acc&egrave;s autoris&eacute;. <br>";
  26.        echo "<a href=\"accueil.html\"><img src=\"images/quitter.jpg\"></a>";
  27.    }
  28.    else
  29.    {
  30.        echo "<b>Acc&egrave;s refus&eacute; !</b>\n<br>Assurez vous que votre login et mot de passe sont valides.<br>";
  31.        echo "<br><hr><br><a href=\"index1.html\"><img src=\"images/retour.jpg\"></a><br>";
  32.    }
  33. }
  34. else
  35. {
  36.    echo "<h2>Veuillez vous authentifier !</h2> ";
  37. }
  38. ?>


 
Comme ça non ?


Message édité par Tirkyth le 31-03-2009 à 10:35:04

---------------
Mon Feedback !
Reply

Marsh Posté le 31-03-2009 à 10:43:19    

On ne peut pas comparer deux chaînes directement avec '=='.
Ca, c'est pas possible :  

Code :
  1. if ($machaine == $machaine2)


 
Il y a plusieurs méthode pour vérifier deux chaînes. Une souvent utilisée est :

Code :
  1. if (strpos($chaine, $chaine2)===FALSE) //chaînes différentes


Message édité par kao98 le 31-03-2009 à 10:43:40

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 10:46:16    

Mince, suis con !
Y'a mieux : la fonction strcmp !
 

Code :
  1. if (strcmp($machaine, $machaine2) == 0) //chaines égales !!!


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 10:46:16   

Reply

Marsh Posté le 31-03-2009 à 11:01:26    

Je ne comprends pas pourquoi tu dis que ce n'est pas possible.

Code :
  1. if ($machaine == $machaine2)


Un code comme cela fonctionne. Ça ne cause pas d'erreur PHP ou quoi que ce soit.
 
Je t'accorde qu'on peut se retrouver avec des résultats inattendus. Par exemple avec

Code :
  1. var_dump("1" == "01" );


qui renvoit "true".
 
Mais il suffit d'utiliser "===" dans ce cas là.

Code :
  1. var_dump("1" === "01" );


renvoit bien false.


---------------
Mon Feedback !
Reply

Marsh Posté le 31-03-2009 à 11:21:59    

J'ai réussi à résoudre mon problème non sans mal :

Code :
  1. <HTML><HEAD><TITLE>Gestion des utilisateurs</TITLE>
  2. </HEAD>
  3. <BODY>
  4. <p>
  5. <?php
  6. if(isset($_POST["nom"]) && isset($_POST["passwd"]))
  7. {
  8. $i=1;
  9.    $nom=$_POST["nom"];
  10. $passwd=$_POST["passwd"];
  11. $chaine=$nom.":".$passwd;
  12. echo "Patientez ...";
  13.         $id_file=fopen("utilisateurs.txt","r" );
  14.        while($ligne=fgets($id_file,60))
  15.        {
  16.         if((trim($ligne) == $chaine))
  17.   {
  18.    fclose($id_file);
  19.    echo "<meta http-equiv=\"REFRESH\" content=\"0;url=accueil1.html\">";
  20.    exit();
  21.   }
  22.   else
  23.   {
  24.      echo "...";
  25.      $i++;
  26.      }
  27.      } //fin du while
  28.  echo "<br><b>Acc&egrave;s refus&eacute; !</b>\n<br>Assurez vous que votre login et mot                 de passe sont valides.<br>";
  29.     echo "<a href=\"index.html\">Retour &agrave; l'accueil</a>";
  30. }
  31. else
  32. {
  33. echo "<h2>Veuillez vous authentifier !</h2> ";
  34. }
  35. ?>


 
Maintenant, je recherche à restreindre l'accès à l'a page d'accueil (accueil1.html) du site pour qu'elle soit redirigée vers la page index.html pour permettre à l'utilisateur de s'authentifier.
Je crois que c'est avec un fichier .htaccess.
Merci pour votre aide. ;)

Reply

Marsh Posté le 31-03-2009 à 11:25:45    

Il n'y a pas d'erreur de syntaxe, je te l'accorde, mais les chaînes ne seront pas comparée en tant que telle.
Il faut utiliser strcmp.


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 11:29:31    

Je veux bien te croire, mais donne moi une source valable où c'est indiqué. Ou des codes exemples qui ne fonctionnent pas avec un "===" mais qui fonctionnent bien avec un strcmp ^^
 
Jusqu'à présent je n'ai jamais eu à faire de strcmp à cause d'un comportement non désiré des "===".


---------------
Mon Feedback !
Reply

Marsh Posté le 31-03-2009 à 11:30:09    

Certes kao98 mais ça fonctionne très bien.
C'est tout à fait ce que souhaite mon boss.
As-tu par hasard la réponse à ma question ?

Reply

Marsh Posté le 31-03-2009 à 11:31:41    

colombat a écrit :

J'ai réussi à résoudre mon problème non sans mal :
(...)


Ok. T'as pas lu mes messages.
 
Utilise strcmp, éventuellement '===' plutôt '==' !


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 11:32:51    

Si j'ai lu, kao98.
Mais mon code marche très bien. ;)

Reply

Marsh Posté le 31-03-2009 à 11:33:50    

Tirkyth a écrit :

Je veux bien te croire, mais donne moi une source valable où c'est indiqué. Ou des codes exemples qui ne fonctionnent pas avec un "===" mais qui fonctionnent bien avec un strcmp ^^
 
Jusqu'à présent je n'ai jamais eu à faire de strcmp à cause d'un comportement non désiré des "===".


J'ai jamais mentionné l'opérateur "===" ! Je ne mentionnais que "==" !
Ne jamais utilisé "==" ! Mais "===", ça fonctionne, effectivement.
Mais dans son code, il n'utilise que "==" ce qui est une grosse erreur car on peut en fin de compte s'identifier avec 0/0 a priori !


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 11:35:23    

colombat a écrit :

Si j'ai lu, kao98.
Mais mon code marche très bien. ;)


Ok.
Essaye de t'identifier avec 0 (le chiffre zéro) en nom d'utilisateur et passwd.


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 11:38:10    

J'ai essayé la fonction strcmp mais ça ne fonctionne pas.
On me met accès refusé.

Reply

Marsh Posté le 31-03-2009 à 11:39:08    

strcmp renvoie 0 quand les chaines sont identiques. Tu l'as bien utilisée ?


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 11:41:54    

En m'identifiant avec 0 et 0 (login et mdp), on me met accès refusé.
Pour information, dans le programme, j'ouvre le fichier utilisateurs.txt qui contient les lignes suivantes :
admin:toto
titi:tutu
gc:gc
 
En entrant, par exemple, admin en login et toto en mdp, ça marche sans problème. Idem pour les 2 autres lignes.
Mais quand on rentre 0 (login) et 0 (mdp) ou autre chaîne de caractère dans ces 2 champs, on m'affiche bien accès refusé.

Reply

Marsh Posté le 31-03-2009 à 11:43:57    

Ok. On va pas débattre 107 ans.
Soit, tu te contentes de ton truc pas sûr à 100%, soit tu remplace  

Code :
  1. if((trim($ligne) == $chaine))


par  

Code :
  1. if(strcmp($ligne, $chaine) == 0)


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 11:47:27    

OK kao98.
Merci encore pour ton aide. ;)
Maintenant, sais-tu comment faire pour rediriger la page d'accueil à la page d'index pour permettre à l'utilisateur de s'authentifier?

Reply

Marsh Posté le 31-03-2009 à 11:55:29    

Pour mon code précédent, il faut bien sûr faire un $ligne = trim($ligne) juste avant !
Pour ton autre question : ce qu'il faut, c'est garder, en session, si on est authentifié ou non. Et sur toutes tes pages nécessitant une authentification, tu test, grâce à ta session, si tu es identifié ou non, et si ce n'est pas le cas, tu redirige la page, grâce à la fonction php header(), vers le form d'identification.


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 11:59:53    

Tu n'aurais pas un exemple ou un lien à me donner, s'il te plaît ?
Je suis novice en PHP et ce n'est pas encore très évident pour moi. ;)

Reply

Marsh Posté le 31-03-2009 à 12:03:53    

J'ai réussi avec la fonction strcmp en suivant tes indications, kao98.
 

Code :
  1. $ligne = trim($ligne);
  2.         if(strcmp($ligne, $chaine) == 0)
  3.   {
  4.    fclose($id_file);
  5.    echo "<meta http-equiv=\"REFRESH\" content=\"0;url=accueil.html\">";
  6.    exit();
  7.   }
  8.   else
  9.   {
  10.      echo "...";
  11.      $i++;
  12.      }


 
Merci encore. ;)


Message édité par colombat le 31-03-2009 à 12:04:41
Reply

Marsh Posté le 31-03-2009 à 12:48:53    

Colombat, tu devrais trouver tout un tas de choses qui te seront utiles sur ce tuto :
http://www.siteduzero.com/tutoriel [...] -site.html


---------------
Mon Feedback !
Reply

Marsh Posté le 31-03-2009 à 13:10:00    

y'a juste un truc qui me choque : les mdp sont en clairs dans le fichier txt :/ Est-ce qu'au moins ce fichier txt est protégé contre le téléchargement avec un .htaccess?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 31-03-2009 à 13:35:38    

Comment faut-il faire pour le protéger ?

Reply

Marsh Posté le 31-03-2009 à 13:41:54    

Et tu es pro !? O.o


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 31-03-2009 à 13:44:48    

autant pour moi, j'ai créé un dossier user avec le fichier .htaccess suivant :
AuthType Basic
AuthName "Acces Restreint"
AuthUserFile "user/utilisateurs.txt"
require valid-user

Reply

Marsh Posté le 31-03-2009 à 14:42:40    

Ca va pouvoir te servir :  
http://www.infres.enst.fr/~danzart [...] s.html#C10
 
Pafce qu'avec ta méthode, t'empêche certes de télécharger ton fichier txt, mais les mdp sont toujours en clair :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed