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 :

Forum - Inscription : vérification d'email et gestion de mots de passe [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Forum - Inscription : vérification d'email et gestion de mots de passe
    Bonsoir bonsoir !

    Je suis actuellement en train de développer un forum en php. Pour cela, j'ai créé une base de données sur alwaysdata, ainsi que des pages forum, login, subscribe.
    Cependant, je suis loin d'avoir de l'expérience (c'est la première fois que je fais ça, et je n'ai pas vraiment de cours, je me "débrouille") et je rencontre quelques petits problèmes.

    Le premier problème :
    Lorsque l'on s'inscrit sur mon forum via le formulaire suivant prévu à cet effet, il n'y a aucun problème. La personne reçoit un e-mail avec ses identifiants, je reçois un e-mail me disant qu'une personne s'est inscrite et le nouvel utilisateur apparaît dans ma base de données... bref, tout roule ! Mais (parce qu'il y a un mais) je me suis rendue compte que je ne gérais pas le cryptage de mot de passe, il apparaît en clair dans ma BDD comme n'importe quel autre champ (gros problème de sécurité/confidentialité), j'ai donc cherché comment y remédier et j'ai trouvé... md5 !

    J'ai compris le principe, un mot sera toujours crypté de la même façon avec md5 donc on cherche à crypter le mot de passe lorsqu'on l'enregistre puis lorsque la personne essaie de se connecter, on récupère le mdp tapé et on le crypte de la même façon avant de le comparer avec celui enregistré... Théoriquement, je ne voyais aucun problème. Mais en pratique, c'est plus compliqué et ça ne marche pas ! J'imagine que je n'ai pas mis les md5 aux bons endroits, ou que j'en ai oublié mais je tourne en rond et ne trouve pas OÙ !

    Alors voilà mon code AVANT le cryptage (celui qui marche, donc) :

    subscribe.php
    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
    <?php
    include 'base.php';
     
    var_dump($_SESSION);
     
    if(''!=$_POST['Name'] && ''!=$_POST['Firstname'] && ''!=$_POST['Nickname'] && ''!=$_POST['email'] && ''!=$_POST['password'] && ''!=$_POST['Verif'] && ''!=$_POST['Reponse'])
    {
     
    		if ($_POST['action']=='Inscription' && $_POST['password']==$_POST['Verif'])
    		{	
    			$query = 'INSERT INTO user (Name, Firstname, Nickname, email, password, Reponse) VALUES (\'' . $_POST['Name'] . '\', \'' . $_POST['Firstname'] . '\', \'' .$_POST['Nickname'] . '\', \'' . $_POST['email'] . '\', \'' . $_POST['password']  . '\',\'' . $_POST['Reponse'] . '\')';
    			$dbResult = mysqli_query($dbLink,$query);
    			if(!$dbResult)
    				{
    					echo 'erreur de requête<br/>';
    					// Affiche le type d'erreur.
    					echo 'erreur : ' . mysqli_error($dbLink) . '<br/>';
    					// Affiche la requête envoyée.
    					echo 'requête : ' . $query . '<br/>';
    					//exit();
    					header('location:./forum.php?err=5');
     
    				}
     
    			else{ 
    				$Message='Voici vos identifiants d\'inscription : ' . "\n";
    				$Message .= 'email :' . $_POST['email'] . "\n";
    				$Message .= 'Mot de passe :' . $_POST['password'] . "\n";
    				$subject='Bienvenue';
    				$headers = 'From: Name <' . $from . '>' ."\n";
    				$headers .= 'Return-Path: <' . $reply . '>' . "\n";
    				$message2 = 'Un nouvel utilisateur s\'est inscrit.';
    				$to2= 'monadresseemail@gmail.com';
    				$subject2 = '[PHP]-Nouvel inscrit sur votre site';
    				$headers2 = 'From: Name <' . $from . '>' ."\n";	
     
    				mail($_POST['email'], $subject, $Message, $headers);
    				mail($to2, $subject2, $message2, $headers2);
     
    				$_SESSION['email']=$_POST['email'];
    				$_SESSION['password']=$_POST['password'];
    				$_SESSION['user_id']='ok';
     
     
    				header('location:./forum.php?err=6');
    				}
    		}
     
    		elseif ($_POST['password']!=$_POST['Verif'])
    		{
    			header('location:./forum.php?err=2');
    		}
    	}
     
    else
    {
    		header('location:./forum.php?err=3');
    }
     
     
    ?>
    Au niveau des erreurs elles servent à gérer :
    5> Requête impossible.
    6> Un email avec vos identifiants vient de vous être envoyé. (ce n'est donc pas une erreur, c'est un succès)
    2> Mots de passe différents.
    3> Toutes les données ne sont pas renseignées. (on ne s'en sert pas puisqu'on vérifie que les champs soient non nuls avant de commencer, mais bon..)



    login.php

    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
    <?php
    include 'base.php';
    $Name=$_POST['Name'];
    $Firstname=$_POST['Firstname'];
    $Nickname=$_POST['Nickname'];
    $email=$_POST['email'];
    $password=$_POST['password'];
    $Verif=$_POST['Verif'];
    $action=$_POST['action'];
     
    if($action=='Connexion')
    {
    	if(!(empty($email) || empty($password)))
    	{
    		$query='SELECT * FROM user WHERE email=\''.$email .'\' AND password=\''.$password .'\'';
     
    		$query_exe = mysqli_query($dbLink, $query);
    		$dbResult = mysqli_fetch_assoc($query_exe);
     
    		if(isset($dbResult['email'],$dbResult['password']))
    		{
    			session_start();
    			$_SESSION['email'] = $email;
    			$_SESSION['password']=md5($password);
    			$_SESSION['user_id']='ok';
    			header('Location:./listpost.php');
    		}
    		else{
    			$_SESSION['user_id']='nok';
    			header('Location:./forum.php?err=7');
    		}
    	}
    	else{
    		$_SESSION['user_id']='nok';
    		header('Location:./forum.php?err=4');
    	}
    }
    ?>
    Pour les erreurs :
    4> Vous devez vous connecter
    7> Mot de passe ou adresse e-mail incorrect

    Comme vous l'aurez sans doute compris, dans le fichier 'base.php', il y a mysqli_connect et mysqli_select_db qui me permettent l'accès à ma BDD sur alwaysdata.

    Maintenant, voilà comme je modifie mon code pour gérer le cryptage (ce qui ne marche pas, donc) :


    subscribe.php
    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
    <?php
    include 'base.php';
     
    var_dump($_SESSION);
     
    if(''!=$_POST['Name'] && ''!=$_POST['Firstname'] && ''!=$_POST['Nickname'] && ''!=$_POST['email'] && ''!=$_POST['password'] && ''!=$_POST['Verif'] && ''!=$_POST['Reponse'])
    {
     
    		if ($_POST['action']=='Inscription' && $_POST['password']==$_POST['Verif'])
    		{	
    			$query = 'INSERT INTO user (Name, Firstname, Nickname, email, password, Reponse) VALUES (\'' . $_POST['Name'] . '\', \'' . $_POST['Firstname'] . '\', \'' .$_POST['Nickname'] . '\', \'' . $_POST['email'] . '\', \'' . md5($_POST['password'])  . '\',\'' . $_POST['Reponse'] . '\')';
    			$dbResult = mysqli_query($dbLink,$query);
    			if(!$dbResult)
    				{
    					echo 'erreur de requête<br/>';
    					// Affiche le type d'erreur.
    					echo 'erreur : ' . mysqli_error($dbLink) . '<br/>';
    					// Affiche la requête envoyée.
    					echo 'requête : ' . $query . '<br/>';
    					//exit();
    					header('location:./forum.php?err=5');
     
    				}
     
    			else{ 
    				$Message='Voici vos identifiants d\'inscription : ' . "\n";
    				$Message .= 'email :' . $_POST['email'] . "\n";
    				$Message .= 'Mot de passe :' . $_POST['password'] . "\n";
    				$subject='Bienvenue';
    				$headers = 'From: Name <' . $from . '>' ."\n";
    				$headers .= 'Return-Path: <' . $reply . '>' . "\n";
    				$message2 = 'Un nouvel utilisateur s\'est inscrit.';
    				$to2= 'monadresseemail@gmail.com';
    				$subject2 = '[PHP]-Nouvel inscrit sur votre site';
    				$headers2 = 'From: Name <' . $from . '>' ."\n";	
     
    				mail($_POST['email'], $subject, $Message, $headers);
    				mail($to2, $subject2, $message2, $headers2);
     
    				$_SESSION['email']=$_POST['email'];
    				$_SESSION['password']=$_POST['password'];
    				$_SESSION['user_id']='ok';
     
     
    				header('location:./forum.php?err=6');
    				}
    		}
     
    		elseif ($_POST['password']!=$_POST['Verif'])
    		{
    			header('location:./forum.php?err=2');
    		}
    	}
     
    else
    {
    		header('location:./forum.php?err=3');
    }
     
     
    ?>
    C'est donc ici la ligne 13 qui a été modifiée.


    login.php

    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
    <?php
    include 'base.php';
    $Name=$_POST['Name'];
    $Firstname=$_POST['Firstname'];
    $Nickname=$_POST['Nickname'];
    $email=$_POST['email'];
    $password=$_POST['password'];
    $Verif=$_POST['Verif'];
    $action=$_POST['action'];
     
    if($action=='Connexion')
    {
    	if(!(empty($email) || empty($password)))
    	{
    		$query='SELECT * FROM user WHERE email=\''.$email .'\' AND password=\''.md5($password) .'\'';
     
    		$query_exe = mysqli_query($dbLink, $query);
    		$dbResult = mysqli_fetch_assoc($query_exe);
     
    		if(isset($dbResult['email'],$dbResult['password']))
    		{
    			session_start();
    			$_SESSION['email'] = $email;
    			$_SESSION['password']=md5($password);
    			$_SESSION['user_id']='ok';
    			header('Location:./listpost.php');
    		}
    		else{
    			$_SESSION['user_id']='nok';
    			header('Location:./forum.php?err=7');
    		}
    	}
    	else{
    		$_SESSION['user_id']='nok';
    		header('Location:./forum.php?err=4');
    	}
    }
    ?>
    Ici, c'est donc la ligne 16 (j'ai également essayé en modifiant directement la ligne 8 en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $password=md5($_POST['password']);
    mais ça n'a pas mieux marché).
    Après avoir modifié ça, quand j'essaie de me connecter après avoir créé un compte, j'obtiens toujours l'erreur 7 à savoir que le mot de passe (ou l'email, mais pas le cas ici) est incorrect. La comparaison entre les mdp cryptés n'est donc pas fructueuse..

    __________________

    Le second problème :
    J'aimerais qu'une personne essayant de s'inscrire avec une adresse e-mail déjà existante dans la BDD ne le puisse pas... J'ai donc essayé de gérer cela en modifiant mon code comme cela :


    subscribe.php
    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
    <?php
    include 'base.php';
     
    var_dump($_SESSION);
     
    if(''!=$_POST['Name'] && ''!=$_POST['Firstname'] && ''!=$_POST['Nickname'] && ''!=$_POST['email'] && ''!=$_POST['password'] && ''!=$_POST['Verif'] && ''!=$_POST['Reponse'])
    {
     
    	$requete = 'SELECT * FROM user WHERE email=\'' .$_POST['email'] . '\'';
    	$resultat=mysqli_query($requete,$dbLink);
     
     
    	if(mysqli_num_rows($resulat)==0){
    		if ($_POST['action']=='Inscription' && $_POST['password']==$_POST['Verif'])
    		{	
    			$query = 'INSERT INTO user (Name, Firstname, Nickname, email, password, Reponse) VALUES (\'' . $_POST['Name'] . '\', \'' . $_POST['Firstname'] . '\', \'' .$_POST['Nickname'] . '\', \'' . $_POST['email'] . '\', \'' . $_POST['password']  . '\',\'' . $_POST['Reponse'] . '\')';
    			$dbResult = mysqli_query($dbLink,$query);
     
     
     
     
    			if(!$dbResult)
    				{
    					echo 'erreur de requête<br/>';
    					// Affiche le type d'erreur.
    					echo 'erreur : ' . mysqli_error($dbLink) . '<br/>';
    					// Affiche la requête envoyée.
    					echo 'requête : ' . $query . '<br/>';
    					//exit();
    					header('location:./forum.php?err=5');
     
    				}
     
    			else{ 
    				$Message='Voici vos identifiants d\'inscription : ' . "\n";
    				$Message .= 'email :' . $_POST['email'] . "\n";
    				$Message .= 'Mot de passe :' . $_POST['password'] . "\n";
    				$subject='Bienvenue';
    				$headers = 'From: Name <' . $from . '>' ."\n";
    				$headers .= 'Return-Path: <' . $reply . '>' . "\n";
    				$message2 = 'Un nouvel utilisateur s\'est inscrit.';
    				$to2= 'monadresseemail@gmail.com';
    				$subject2 = '[PHP]-Nouvel inscrit sur votre site';
    				$headers2 = 'From: Name <' . $from . '>' ."\n";	
     
    				mail($_POST['email'], $subject, $Message, $headers);
    				mail($to2, $subject2, $message2, $headers2);
     
    				$_SESSION['email']=$_POST['email'];
    				$_SESSION['password']=$_POST['password'];
    				$_SESSION['user_id']='ok';
     
     
    				header('location:./forum.php?err=6');
    				}
    		}
     
    		elseif ($_POST['password']!=$_POST['Verif'])
    		{
    			header('location:./forum.php?err=2');
    		}
    	}
    	else{
    		header('location:./forum.php?err=8');
    	}
    }
     
    else
    {
    	header('location:./forum.php?err=3');
    }
     
     
    ?>
    Les modifications sont au début du code (lignes 7-14) mais au final, on rentre toujours dans la boucle même si l'adresse e-mail existe déjà... J'en déduis que la requête n'est pas comprise mais je ne comprends pas si c'est un problème de syntaxe (à priori pas d'erreur dans le code), de place.. Pour moi, la boucle semble logique et comme je suis vraiment débutante dans ce domaine, je ne vois vraiment pas où ça coince...




    Voilà, j'espère vraiment que certains d'entre vous pourront m'aider à règler ces deux petits problèmes qui m'empêchent de continuer à avancer dans la réalisation de mon forum.
    Merci beaucoup à tout ceux qui prendront la peine de lire (j'admets que c'est un peu long) et surtout de répondre !

    Bonne soirée !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Première erreur : on ne met pas des données externes (venant de POST par exemple) dans une requête. Cela ouvre la porte aux injections SQL qui sont la manière la plus courante de pirater un site.
    Il faut que tu t’intéresses aux requêtes préparées.

    Si tu débutes, apprends plutôt PDO que mysqli, c'est beaucoup plus simple à manipuler.

    Concernant ton premier problème, je ne vois pas de problème de logique de code.
    Est-ce que ta colonne "password" peut stocker 32 caractères ?
    Ton premier reflexe devrait être un debugage simple : ton code te dit que les chaines sont différentes, et bien affiche les pour voir ce qu'il compare.

    Par contre MD5 est obsolète.
    Regarde plutôt http://grunk.developpez.com/tutoriel...sse-securises/

    Pour ton deuxième problème, tu devrais aussi faire un debugage simple : affiche $requete pour voir ce que tu executes.

    Au passage, nomme tes colonnes et tes variables uniformement ; ne met pas un colonne avec une majuscule et la suivante sans.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Invité
    Invité(e)
    Par défaut
    Pour ton premier probleme, le code semble juste. Est ce que tu as limite le nombre de caracteres du champ password de ta base de donnees ? Ca pourrait expliquer pourquoi la comparaison ne marche pas si le md5 stocke est tronque.

    Pour ton deuxieme probleme, tu as une erreur de typo sur la ligne mysqli_num_rows($resulat), il manque un 't'

    EDIT : trop lent

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu devrais développer en affichant toutes les erreurs PHP. Ton serveur t'aurai signalé la faute dans le nom de la variable.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre averti
    Avatar de Dumbeldor
    Homme Profil pro
    Développeur Concepteur Banque postale / Ecole d'ingénieur Alternance
    Inscrit en
    Novembre 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Concepteur Banque postale / Ecole d'ingénieur Alternance

    Informations forums :
    Inscription : Novembre 2013
    Messages : 88
    Points : 301
    Points
    301
    Par défaut
    Même avis que Sabotage, je pense qu'il serait mieux que tu apprennes pdo au lieu de Mysqli ça te permettra de ne pas avoir de faille injection SQL.

    Ensuite pour ton deuxième problème, il existe dans les BDD des moyens de garantir qu'un champ reste unique donc faut que tu regardes sur ce côté comme ça déjà tu seras Sur et Certains qu'il y a qu'une personne qui a cette adresse mail : http://www.w3schools.com/sql/sql_unique.asp
    N'oubliez pas de mettre un petit pouce vert si mon message vous a aidé !

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2016
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Merci énormément à vous tous ! Grâce à vos réponses, mes deux problèmes sont résolus ! Tout fonctionne parfaitement

    Sabotage & Mrsky : merci beaucoup! Le problème venait bien du fait que password ne pouvait contenir que 20 caractères dans ma BDD, j'ai donc modifié et tout fonctionne !
    Dumbledore : J'ai fait comme suggéré pour le second problème, j'ai passé l'email en unique dans la BDD et ça marche, la personne ne peut pas s'inscrire si l'email est déjà dans la base !

    Pour le second problème, j'avais quand même essayé en corrigeant "resultat" mais ça n'a pas mieux marché. La solution du unique me convient

    Merci encore !

    Bonne journée !

  7. #7
    Membre averti
    Avatar de Dumbeldor
    Homme Profil pro
    Développeur Concepteur Banque postale / Ecole d'ingénieur Alternance
    Inscrit en
    Novembre 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Concepteur Banque postale / Ecole d'ingénieur Alternance

    Informations forums :
    Inscription : Novembre 2013
    Messages : 88
    Points : 301
    Points
    301
    Par défaut
    Super ravis d'avoir pu aider.
    Si tu as d'autre question n'hésite pas.

    Bonne journée.
    N'oubliez pas de mettre un petit pouce vert si mon message vous a aidé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E]Gestion de mot de passe
    Par Yolak dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 18/04/2007, 13h23
  2. Gestion de mot de passe
    Par cyril.ppn dans le forum C++Builder
    Réponses: 7
    Dernier message: 14/02/2007, 12h06
  3. gestion des mot de passe avec Access
    Par cyberbiker dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 07/09/2006, 15h42
  4. [LG] Gestion de mot de passe
    Par kakaroto dans le forum Langage
    Réponses: 3
    Dernier message: 02/08/2005, 09h13
  5. Génération aléatoire et gestion de mots de passe
    Par thomine dans le forum Sécurité
    Réponses: 5
    Dernier message: 23/03/2005, 16h58

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