script de connexion défectueux

script de connexion défectueux - PHP - Programmation

Marsh Posté le 23-07-2010 à 06:00:17    

Salut tout le monde,
 
Je suis en train de tester un script trouver dans un tuto php pour faire un système de connexion-identification des utilisateurs d'un site. J'ai eu beau cherché je ne vois pas pourquoi ça ne fonctionne pas.
 
Quand je tape un login et un mot de passe au hazard (donc faux) la réponse est : "Félicitation {login} vous êtes maintenant connecté!"  
 
Ce qui est très gênant pour un script d'authentification s'il laisse rentrer n'importe qui.  :heink:  
 
Je vous poste tous les morceaux de code que j'utilise (au cas ou une bêtise m'aura échappé). Si une grosse faute vous saute aux yeux prévenez moi que j'essaie de régler le problème.
 
Le code SQL de création de ma table

Citation :

create table CAROUBLE
(
   ID_CAROUBLE  int(10) not null auto_increment,
   ALLONYME     varchar(32) not null,
   VERROU  varchar(32) not null,
   primary key (ID_CAROUBLE)
)ENGINE=MYISAM;


 
Le code de la page connexion.html :

Citation :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Connexion</title>
</head>
<body>
<center>
    <form action="verifpass.php" method="post">
        <table>
            <tr>
              <td>Login :&nbsp;</style></td>
              <td><input type="text" Name="pseudo" /></td>
            </tr>
            <tr>
              <td>Password :&nbsp;</td>
              <td><input type="password" Name="pass" /></td>
            </tr>
            <tr>
              <td>&nbsp;</td>
              <td><center><input type="submit" name="verification" value="Envoyer" /></center></td>
            </tr>
        </table>
    </form><br />
<a href="index.html">Retour &agrave; l'accueil</a>
</center>
</body>
</html>


 
Le code de la page verifpass.php chargé de la vérification du couple login/password :

Citation :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
</head>
<body>
<?php
$host = "localhost";
$user = "root";
$password = "";
$bdd = "securite";
//--------- Connection à Mysql  ----------//
mysql_connect($host, $user, $password) or die("Impossible de se connecter au serveur !" );
mysql_select_db($bdd) or die("Impossible de se connecter &agrave; la base de donn&eacute;es !" );
 
//--------- Creation de la signature -----//
include('param.inc.php');
//--------- Insertion des valeurs --------//
$seing = $_POST['pass'];
$sceau = md5(contreseing($seing));
$surnom = $_POST['pseudo'];
$compIdent='SELECT COUNT(*) FROM CAROUBLE WHERE ALLONYME = "'.mysql_real_escape_string($surnom).'" AND VERROU = "'.mysql_real_escape_string($sceau).'"';
mysql_query($compIdent) or die(mysql_error());
?>
<p>F&eacute;licitations <?php echo(htmlentities($surnom)); ?>, vous &ecirc;tes connect&eacute;.</p><br /><br />
<a href="index.html">Retour &agrave; l'accueil</a>
</body>
</html>


 
Pour finir le code de la page param.inc.php qui fabrique la signature du mot de passe:

Citation :

<?php
 function contreseing($seing) {
 $praefixus = "d^9@0-";
 $subfixus = "#8+S%cZ";
 $seing = $praefixus.$seing.$subfixus;
 return strrev($seing);
 }
?>


 
Je ne vois vraiment pas d'où peut venir le dysfonctionnement, mais comme c'est mon premier test d'authentification des utilisateurs je ne m'attendais pas vraiment à ce que ça fonctionne du premier coup.
 
Merci du temps que vous avez pris pour lire ce message.


Message édité par SV_LVH le 23-07-2010 à 06:01:15

---------------
Quand vous demandez sur un forum comment changer un pneu de voiture peu de gens vous répondent. Et ceux qui le font vous expliquent généralement comment rouler sur 3 roues.
Reply

Marsh Posté le 23-07-2010 à 06:00:17   

Reply

Marsh Posté le 23-07-2010 à 07:43:52    

A première vue, tu fais une requête SQL mais tu traites absolument pas le résultat. La requête peut tout aussi bien renvoyer 0 ou un résultat que ton script agit pareil. Donc vu que le résultat de la requête est jamais vérifié et qu'il n'y a pas de message autre que "Félicitations vous êtes loggués" ça peut pas vraiment te dire autre chose.
 
Sinon je vois mal l'intérêt du SELECT COUNT(*). Perso je ferais un SELECT normal, puis un mysql_num_rows pour connaître le nombre de lignes renvoyées [:transparency]


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 23-07-2010 à 08:22:43    

On m'a proposé cela comme solution:

Citation :

$compIdent='SELECT * FROM CAROUBLE WHERE ALLONYME = "'.mysql_real_escape_string($surnom).'"';
$req = mysql_query($compIdent) or die(mysql_error());
while($data = mysql_fetch_array($req))
   {
        $bpass = $data['VERROU'];
        if($sceau != $bpass)
            {
                echo ("Erreur de mot de passe" );
            }
        else
            {
    echo ("<p>F&eacute;licitations ".(htmlentities($surnom))." vous &ecirc;tes connect&eacute;.</p><br /><br />\n" );
    echo ("<a href=\"index.html\">Retour &agrave; l'accueil</a>\n" );
            }
    }


 
Mais si j'introduis un couple login/password incorrecte j'obtiens une belle page toute blanche. Par si si je tape correctement l'identifiant et le mot de passe, j'ai le fameux message "Félicitations {login}...".
 
D'où ça peut venir?

Reply

Marsh Posté le 23-07-2010 à 12:12:12    

Peut-être parce que tu fais ton test dans un "while". Donc si ton "$surnom" n'existe pas dans ta base, tu n'entres pas dans la boucle...
 
Sinon :
- tu n'as pas besoin d'un "while" : a priori, si tu as plusieurs utilisateurs avec le même login / mdp, c'est un peu douteux => mysql_num_rows est suffisant pour le test. (si 0 erreur, si 1 ok (et si > 1 :heink: )
- dans ta requête, tu ne recherches que le "surnom". Il serait bien de vérifier le mot de passe, tant qu'à faire   ;)
- pourquoi faire un select * ? Tu as vraiment besoin de récupérer le mot de passe ? J'en doute un peu. L'identifiant et le surnom devraient te suffire.


Message édité par deliriumtremens le 23-07-2010 à 12:15:32
Reply

Marsh Posté le 23-07-2010 à 16:02:26    

Il faut récupérer le mot de passe pour le vérifier.


---------------
http://www.aideinfo.com/  Whois adresses IP/domaines le plus évolué !!  FAQ Free Mobile
Reply

Marsh Posté le 23-07-2010 à 18:38:44    

sinon tu as plus simple et plus performant, la méthode de WiiDs :

Code :
  1. $sql = "SELECT machin FROM users WHERE login = '$tonlogin' AND pass = '$tonpass'";
  2. $query = mysql_query($sql);
  3.  
  4. if(!$query) {
  5.   // bla bla bla query failed
  6. }
  7.  
  8. if(mysql_num_rows($query)) {
  9.  // connexion réussie
  10. } else {
  11.  // échec de la connexion (login OU mdp incorrect)
  12. }

Reply

Marsh Posté le 24-07-2010 à 16:48:53    

En effet cela fonctionne correctement maintenant, merci à tous. Il me reste toutefois quelques questions à propos de la connexion.
 
Comment faire que pour chaque page du site (ou du moins celles que je veux protéger) vérifie que l'utilisateur c'est bien identifié à un moment donné (on va pas lui demander de s'identifier à chaque changement de page non plus )?
 
Et ensuite comment fait-on pour bloquer ou libérer l'accès à ces pages en fonction de la réponse de la vérification de l'identification?
 
Navré de vous ennuyer avec ça mais c'est la première authentification que j'installe sur un site, donc je ne maitrise pas du tout le sujet.

Reply

Marsh Posté le 24-07-2010 à 16:53:26    

il y a pas mal de choses sur le net à ce sujet
 
pour faire ce que tu veux, tu devrais utiliser les sessions
ça ressemblerait à ça (en gros) :

Code :
  1. // connexion
  2. if(login_et_pass_correct)
  3. {
  4.    $_SESSION['connected'] = true;
  5. }
  6.  
  7. // déconnexion
  8. $_SESSION['connected'] = false;
  9.  
  10. // page privée
  11. if($_SESSION['connected'] !== true)
  12. {
  13.    header('location: acces/non/autorise.php');
  14.    exit();
  15. }
  16.  
  17. // reste de la page


 
;)


Message édité par Profil supprimé le 24-07-2010 à 16:53:48
Reply

Marsh Posté le 24-07-2010 à 19:19:09    

Cookies ou sessions PHP, au choix.
 
Par contre, Luc@s, dans ton code, il faut remplacer

Code :
  1. if($_SESSION['connected'] !== true)

par

Code :
  1. if($_SESSION['connected'] != true)


Message édité par aideinfo le 24-07-2010 à 19:20:36

---------------
http://www.aideinfo.com/  Whois adresses IP/domaines le plus évolué !!  FAQ Free Mobile
Reply

Marsh Posté le 25-07-2010 à 10:16:28    

les deux fonctionnent
 
et sinon, mieux vaut utiliser les sessions pour ce genre de choses


Message édité par Profil supprimé le 25-07-2010 à 10:16:45
Reply

Marsh Posté le 25-07-2010 à 10:16:28   

Reply

Marsh Posté le 25-07-2010 à 13:43:45    

La syntaxe !== compare aussi le type de donnée, il vaut donc mieux utiliser !=, la première syntaxe n'étant pas approrpiée dans le cas présent.


---------------
http://www.aideinfo.com/  Whois adresses IP/domaines le plus évolué !!  FAQ Free Mobile
Reply

Marsh Posté le 25-07-2010 à 14:04:44    

merci je sais :o dans mon exemple j'ai utilisé que des booléans, donc... bref :p

Reply

Marsh Posté le 26-07-2010 à 14:35:41    

Merci pour vos réponses.
 
$_SESSION['login'] = $surnom;     // $sceau c'est le mot de passe
 
Je suis en train de tester cette technique mais pour l'instant cela ne fonctionne pas.  
 
Sur ma page verifpass.php :

Code :
  1. while($data = mysql_fetch_array($req))
  2.   {
  3.        $bpass = $data['VERROU'];
  4.        if($sceau != $bpass)
  5.            {
  6.         $_SESSION['connected'] = false;
  7.                echo "Erreur de mot de passe";
  8.         echo "<a href=\"page-protegee.php\" target=\"_blank\">test de la page</a>";
  9.            }
  10.        else
  11.            {
  12.         $_SESSION['connected'] = true;
  13.         echo "<p>F&eacute;licitations ".(htmlentities($surnom))." vous &ecirc;tes connect&eacute;.</p><br /><br />\n";
  14.         echo "<a href=\"index.html\">Retour &agrave; l'accueil</a><br />\n";
  15.         echo "<a href=\"page-protegee.php\">test de la page</a>";
  16.            }
  17.    }


 
et sur la page 'page-protegee.php' :

Code :
  1. <?php
  2. if($_SESSION['connected'] !== true)
  3. {
  4.   header('location: acces/non/autorise.php');
  5.   exit();
  6. }?>
  7. <p>Ceci est une page protégée. Si vous accédez à cette page sans vous être identifié, c'est que le script ne fonctionne pas.</p>


 
Quand je mets un login/password valide et que je clique sur le lien vers la page protégée, j'ai le message d'erreur que je devrais avoir si je n'étais pas identifié : "The requested URL /essais/securite/acces/non/autorise.php was not found on this server."
 
Ai-je oublié quelque chose?


Message édité par SV_LVH le 26-07-2010 à 14:36:43
Reply

Marsh Posté le 26-07-2010 à 14:49:39    

tu ne comprends pas ce que tu fais surtout.
Apprends les bases et essaye de comprendre ce que tu fais :(

Reply

Marsh Posté le 26-07-2010 à 15:27:05    


+1.
 
En copiant collant du code ça finira toujours par foirer dans le pire des cas ou bien être bourré de failles de sécurité dans le pire des cas. [:spamafote]


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Sujets relatifs:

Leave a Replay

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