IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

difficulté avec md5


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 21
    Par défaut difficulté avec md5
    Bonsoir à tous, j'ai un souci avec le md5 comme marqué dans le titre, je vous expose mon problème.

    Je suis en ce moment entrain de développer un site web avec une partie pour les membres, donc mes futurs visiteurs pourront s'enregistrer et se loguer.
    Pour un souci de sécurité je veux que le mot de passe des membres soit haché dans ma base de donnée. j'ai réussi à haché les mots de passe ce n'est pas encore le problème.

    Voici le problème, quand le membre va pour se loguer il rentre son pseudo et son mot de passe, mais cela ne fonctionne pas.
    Mon script fonctionne parfaitement sans la fonction md5.
    J'ai essayé de copier le mot de passe haché sur ma base de donnée et de le coller la ou le membre est supposé l'inscrire et la ça fonctionne.

    Ce qui veux dire qu'il n'y à pas une remise en forme du mot de passe haché vers le mot de passe d'origine que le membre à tapé lors de sont inscription.
    Et je sais vraiment pas comment procéder, de l'aide serai la bien venu.

    Voici ma requête lors de l'enregistrement du membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("INSERT INTO membre (login_membre, pass_membre, mail_membre, date_inscription, statut_membre, avatar) VALUES('$login', md5('$pass'), '$mail', NOW('".$_POST["date_inscription"]."'), '$user', '$fichier')");
    Donc ici tout se passe bien le mot de passe est bien haché par la fonction md5 dans ma base de donnée (dans ma bdd le champ pass_membre est en varchar(50) donc pas de souci avec le nombre de caractére).

    Voici le deuxième script qui permet de loguer le membre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    <?php session_start();
     
    include("include/inc_connexion/bdd.php");
    if(isset($_POST['envoyer']))
    {
    		$login = mysql_real_escape_string(htmlspecialchars ($_POST['login']));
    	    $pass = mysql_real_escape_string(htmlspecialchars ($_POST['mot_de_passe']));
     
    	if($login != '' and $pass!= '' )
    	{
     
    		$demande = mysql_query("SELECT * FROM membre WHERE login_membre= '$login' ");
    		$reponse = mysql_fetch_array($demande);
     
    	if( $reponse['login_membre'] == $login AND $reponse['pass_membre'] == $pass)
    	{
    		$_SESSION['id'] = $reponse['id_membre'];
    		$_SESSION['statut'] = $reponse['statut_membre'];
    		$_SESSION['login'] = $reponse['login_membre'];
    		$_SESSION['mail'] = $reponse['mail_membre'];
     
    		header('Location: index.php');
     
     
    	}
     
    	else
    	{
     
    	header('Location: index.php?erreur=1');
    	}
    	}
     
    	else
    	{
    		header('Location: index.php?erreur=2');
    	}
    }
     
     ?>
    C'est ce script qui me pose problème, je ne sais pas ou mettre la fonction md5.

    Je remercie les personnes qui porterons un œil sur mon souci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 37
    Par défaut
    as tu essayé avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    if( $reponse['login_membre'] == $login AND $reponse['pass_membre'] == md5($pass))
    ...
    ?

  3. #3
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Plusieurs possibilités, soit dans le PHP, soit dans la requete MySQL.
    Personnellement je le ferais dans le SQL directement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $demande = mysql_query("SELECT * FROM membre WHERE login_membre= '$login' AND pass_membre = md5('$pass')");
    Tu éviteras ainsi ton test suivant, sur le login et le pass, et tu testeras plutot si tu as des rows en résultat de la query, simplement.

    Autre remarque: tu dis avoir fait un champ varchar(50) pour le mot de passe.
    Je dirais juste que
    1. le varchar est inutile car un hash md5 aura toujours la même taille
    2. 50 caractères sont inutiles, un hash md5 fera toujours 32 caractères.
    => donc un char(32) sera plus optimisé.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 21
    Par défaut
    Merci pour vos réponses, mais cela ne fonctionne pas, j'avais déjà essayé.

  5. #5
    Membre confirmé Avatar de dervish
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 100
    Par défaut
    salut,
    pour rentrer un pass dans ta base, tu peux utiliser le md5 de php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("INSERT INTO membre (login_membre, pass_membre, mail_membre, date_inscription, statut_membre, avatar) VALUES('$login', '".md5($pass)."', '$mail', NOW('".$_POST["date_inscription"]."'), '$user', '$fichier')");
    Puis pour le login de l'utilisateur, tu utilises:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mysql_query("SELECT * FROM membre WHERE login_membre= '$login' AND pass_membre = '".md5($pass)."');
    Pour le coup, vu les données que tu sors de la base réduis donc la portée de ta requète. Le login tu l'as déjà donc tu n'as plus (vu ton script) qu'à sortir id_membre, statut_membre et mail_membre voire l'avatar de ta table, ça consomme moins qu'un Select *.
    De plus, comme ta requète ne contient que le hash du mot de passe, tu peux t'abstenir d'utiliser mysql_real_escape_string et htmlspecialchars sur le mot de passe lors de la mise en base et du test de la présence de l'utilisateur en base.

  6. #6
    Membre éprouvé

    Homme Profil pro
    Software Engineer
    Inscrit en
    Août 2004
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 173
    Par défaut
    Dans ton code actuel tu compares une chaîne en clair avec un hash à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reponse['pass_membre'] == $pass
    Il faut que $pass soit aussi un hash.
    Pour ca tu peux rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $pass = md5(mysql_real_escape_string(htmlspecialchars ($_POST['mot_de_passe'])));

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 21
    Par défaut
    Voila j'ai reussi, je vous montre le script modifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    .
    .
    .
    $login = mysql_real_escape_string(htmlspecialchars($_POST['login']));
    		$pass = md5(mysql_real_escape_string(htmlspecialchars ($_POST['pass'])));		
    	if($login != '' and $pass!= '' )
    	{
     
     
    	    $demande = mysql_query("SELECT * FROM membre WHERE login_membre= '$login' AND pass_membre = md5('$pass')");
    		$reponse = mysql_fetch_array($demande);
     
    	if( $reponse['login_membre'] == $login AND $reponse['pass_membre'] == md5($pass))
    .
    .
    .
    J'ai rajouté 3 fonctions md5 pour que cela fonctionne, maintenant je vais prendre en considération les modifications que vous m'avez montré.
    Je vous remercie pour vos réponses qui m'ont bien aidée.

    Amicalement Jounax.

  8. #8
    Membre chevronné
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Hmm il doit y avoir un soucis quelque part avant alors... Genre un double-md5 sur le pass qd tu as inséré l'utilisateur.

    Parce que là, ton script recoit le pass, il en fait le md5, et avec ce md5 tu en refais encore un autre dans la requete MySQL...

    Autre remarque: ta requête SQL récupère déjà uniquement l'utilisateur dont le login et le pass lui sont spécifiés. Donc ca ne sert à rien de revérifier encore une fois après si le résultat retourné par MySQL correspond bien au login pass que tu cherchais

    Tu peux simplement utiliser un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    $demande = mysql_query(...);
    if (mysql_num_rows($demande)) {
       // utilisateur trouvé
    }
    ?>

  9. #9
    Membre éprouvé

    Homme Profil pro
    Software Engineer
    Inscrit en
    Août 2004
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 173
    Par défaut
    Pourrais-tu nous montrer le code servant à ajouter un nouvel utilisateur ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 21
    Par défaut
    Citation Envoyé par Vivian Pennel Voir le message
    Pourrais-tu nous montrer le code servant à ajouter un nouvel utilisateur ?
    Biensur le voici (il est un peu long car je fais des tests comme vous pouvez le voir)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    	<?php
     
    if(isset($_GET['accepter']))
    {
        include("./bdd.php");
     
    	if(isset($_POST['envoyer']))
    	{
    		$login = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
    		$pass = mysql_real_escape_string(htmlspecialchars (md5($_POST['pass'])));
    		$pass2 = mysql_real_escape_string(htmlspecialchars (md5($_POST['pass2'])));
    		$mail = mysql_real_escape_string(htmlspecialchars($_POST['mail']));
    		$time = mktime();
     
    		$ip = $_SERVER['REMOTE_ADDR'];
     
     
    		if($login != NULL)
    		{
    			if($pass != NULL)
    			{
    				if($pass == $pass2)
    				{
    					$demande = mysql_query("SELECT COUNT(*) AS nbre_entre FROM membre WHERE login_membre = '$login'") ;
    					$reponse = mysql_fetch_array($demande);
     
    					if($reponse['nbre_entre'] == 0)
    					{
     
     
    					$demande1 = mysql_query("SELECT COUNT(*) AS nbre_entre1 FROM membre WHERE mail_membre = '$mail'") ;
    					$reponse1 = mysql_fetch_array($demande1);
     
    					 if($reponse1['nbre_entre1'] == 0) 
    					 {
     
    						if( preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $mail))
    						{
    							$user = "user";
    							$fichier = "media/barre.png";
    							mysql_query("INSERT INTO membre (login_membre, pass_membre, mail_membre, date_inscription, statut_membre, avatar) VALUES('$login', md5('$pass'), '$mail', NOW('".$_POST["date_inscription"]."'), '$user', '$fichier')");
    							$list = mysql_query("SELECT * FROM membre WHERE login_membre= '$login'");
     
    							echo '<p>Votre enregistrement s\'est déroulé avec succès!<br /><a href="index.php">Accueil</a></p>';
    						}
     
    						else
    						{
     
    							echo '<b>ENREGISTREMENT</b><p>Veuillez indiquer une adresse email valide! merci<br /><a href="enregistrement.php?accepter=1">retour</a></p>';
    						}
    					}
     
     
    					  else
    					  {
     
    						echo '<b>ENREGISTREMENT</b><p>Cette adresse email est déjà utilisé!<br /><a href="enregistrement.php?accepter=1">retour</a></p>';
    						}
    					}
     
     
     
     
     
    					else
    					{
    						echo '<b>ENREGISTREMENT</b><p>Ce pseudo est déjà utilisé! <br /><a href="enregistrement.php?accepter=1">retour</a></p>';
    					}
     
     
    				}
     
    				else
    				{
    					echo '<b>ENREGISTREMENT</b><p>Le mot de passe n\'est pas correct!<br /><a href="enregistrement.php?accepter=1">retour</a></p>';
    				}
    			}
     
    			else
    			{
    				echo '<b>ENREGISTREMENT</b><p>Veuillez indiquer un mot de passe! merci<br /><a href="enregistrement.php?accepter=1">retour</a></p>';
    			}
     
    		}
     
    		else
    		{
    			echo '<b>ENREGISTREMENT</b><p>Veuillez indiquer un login! merci<br /><a href="enregistrement.php?accepter=1">retour</a></p>';
    		}
     
    	}
     
    	else
    	{
     
    ?>
    <form method="post" action="">
     
    <b>ENREGISTREMENT</b>
    <p class="infos">Information (Tous les champs doivent être remplis)</p>
    <table width="100%">
    <tr><td><span class="Style1">Nom d'utilsateur :</span></td><td><input type="text" name="pseudo" /></td></tr>
    <tr><td><span class="Style1">E-Mail : </span></td><td><input type="text" name="mail" /></td></tr>
    <tr><td><span class="Style1">Mot de passe : </span></td><td><input type="password" name="pass" /></td></tr>
    <tr><td><span class="Style1">Confirmer le mot de passe : </span></td><td><input type="password" name="pass2" /></td></tr>
    <p></p>
    <tr><td colspan="2" align="center"><input type="submit" value="S'enregistrer" name="envoyer"/></td></tr>
    </table>
    </form>
    Sinon se code fonctionne parfaitement, mais si on peut l'améliorer je ne dit pas non.

    Amicalement Jounax

  11. #11
    Membre éprouvé

    Homme Profil pro
    Software Engineer
    Inscrit en
    Août 2004
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 173
    Par défaut
    Comme je le pensais tu hash deux fois le mot de passe.

    Une fois avec PHP une fois avec ton SGBD.

    Ainsi par exemple un mot de passe : toto te donnera le hash suivant

    f71dbe52628a3f83a77ab494817525c6

    ceci correspondant à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pass = mysql_real_escape_string(htmlspecialchars (md5($_POST['pass'])));
    Ensuite lors de ta requête pour insertion tu rappelles md5 de ton SGBD cette fois et donc au final le hash inséré sera :

    1f87c7027a89d1a84ebdddab67b6193b qui n'est pas égal du tout au premier.
    ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("INSERT INTO membre (login_membre, pass_membre, mail_membre, date_inscription, statut_membre, avatar) VALUES('$login', md5('$pass'), '$mail', NOW('".$_POST["date_inscription"]."'), '$user', '$fichier')");
    C'est pourquoi lors de ta vérification tu as du rajouter deux fois l'appel à md5

    Donc tu peux supprimer md5 dans ta requête d'insertion ici et en supprimer un dans la fonction de vérification de connexion

Discussions similaires

  1. [SSIS][2k5]Difficulté avec SSIS
    Par david71 dans le forum SSIS
    Réponses: 9
    Dernier message: 05/01/2006, 19h28
  2. [JS] Difficulté avec le onmouseover...
    Par Pleymo dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/11/2005, 12h09
  3. [VBA] difficultés avec une requête INSERT
    Par elias dans le forum Access
    Réponses: 7
    Dernier message: 06/09/2005, 14h53
  4. Difficultés avec - onchange - !
    Par zakuli dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/07/2005, 12h00
  5. Difficultés avec TMenuItem.OnDrawItem
    Par ybruant dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/01/2005, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo