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

Langage PHP Discussion :

Mot de passe oublié PHP


Sujet :

Langage PHP

  1. #21
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut
    Justement quand j'essaye de préparer la requête "sql" j'ai des erreurs :

    Ce code fonctionne mais tout le monde peut accéder à la page de réinitialisation si il met à la fin du lien "mdpoublie.php?token=1ounimportequoi" :

    Code php : 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
    <?php include("bdd/connexionBD.php"); ?>
     
    <?php
     
    	//Récupération du token depuis la variable $_GET
    	@$token = $_GET['token'];
     
    	//Vérification de l'existance du token dans la base de données
    	@$sql = 'SELECT mdp FROM `bdd`.`inscription` WHERE token="'.$_GET['token'].'"';
    	$req = mysqli_query($connexion, $sql) or die ('erreur sql!<br>'.$sql.'<br>'.mysql_error());
     
     
    	if ($token)
    	{	
     		echo "<font size='5pt' face='cursive' color='#4163E1'><center><b>Vous pouvez changer votre mot de passe.</center></b></font>";
    	}
     
    	else
    	{
    		echo "<script>alert(\" Redirection vers la page d'accueil. \")</script>";
    		echo "<SCRIPT>document.location.href='index.php'</SCRIPT>";
    	}
    ?>
     
    <!DOCTYPE html>
    <meta charset="utf-8"/>
    <link rel="stylesheet" type="text/css" href="style/style.css" charset="utf-8" />
    <html>
    	<head>
    		<title>Mot de passe oublié</title>
    	</head>
    		<form id="formulaire" action="" method ="POST" >
    			<!--Permet de créer les champs d'écritures -->
    			<fieldset>
    				<label for="mdp">Nouveau mot de passe </label>
    				<input type="password" name="mdp" placeholder="Mot de passe" required pattern="^.{6,}$" oninvalid="setCustomValidity('Votre mot de passe doit contenir au minimum 6 caractères')" onchange="try{setCustomValidity('')}catch(e){}" /><br>
    				<label for="rmdp">Répéter mot de passe </label>
    				<input type="password" name="rmdp" placeholder="Répéter mot de passe" required pattern="^.{6,}$"><br>
    			</fieldset>
    			<center><p><input value="" type="submit" name="submit5" id="submit5"></p></center>
     
    </html>
     
     
    <?php
    	if(isset($_POST['submit5']))
    	{	
    		//Vérifie si les mots de passes sont égaux dans le formulaire, change le mdp et génére un nouveau token dans la bdd puis redirige vers l'accueil.
    		if ($_POST['mdp'] == $_POST['rmdp'])
    		{
     
    			$sql = 'UPDATE `bdd`.`inscription` 
    			SET `mdp` = "'.sha1($_POST['mdp']).'",
    			`token` = "'.sha1(uniqid(rand())).'"
    			WHERE token="'.$_GET['token'].'"';
    			$req = mysqli_query($connexion, $sql) or die ('Erreur sql !<br>'.$sql.'<br>'.mysql_error());
    			echo "<script>alert(\" Votre mot de passe à bien été modifié. \")</script>";
    			echo "<SCRIPT>document.location.href='index.php'</SCRIPT>";
     
    		}echo "<br><font size='3pt' face='cursive' color='red'><center><b>Les mots de passes ne sont pas identiques.</center></b></font></form>";
    	}
    ?>


    Ce code ne marche pas mais si le token rentré n'est pas dans la base de donnée, on n'accède pas à la page de réinitialisation

    Code php : 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
    <?php include("bdd/connexionBD.php"); ?>
     
    <?php
     
    	//Récupération du token depuis la variable $_GET
    	$token = $_GET['token'];
     
    	//Vérification de l'existance du token dans la base de données
    	$sql = 'SELECT token FROM `bdd`.`inscription` WHERE token= ?';
     
        $prepa = mysqli_prepare($connexion, $sql);				//Prépare la requète.
     
        mysqli_stmt_bind_param($prepa ,'s', $token);			//Lie les variables à la requête précédement inscrite.
     
        $prepa->execute();										//Execute la requête.
     
        $resultat = mysqli_stmt_fetch($prepa);					//Retourne le résultat de la requête.
     
     
    	if ($resultat)
    	{	
    		echo "<font size='5pt' face='cursive' color='#4163E1'><center><b>Vous pouvez changer votre mot de passe.</center></b></font>";
     
    		$sql = 'SELECT mdp FROM `bdd`.`inscription` WHERE mdp= ?';
     
    	    $prepa = mysqli_prepare($connexion, $sql);			//Prépare la requète.
     
    	    mysqli_stmt_bind_param($prepa ,'s', $mdp);			//Lie les variables à la requête précédement inscrite.
     
    	    $prepa->execute();									//Execute la requête.
     
    	    $resultat = mysqli_stmt_fetch($prepa);				//Retourne le résultat de la requête.
    	}
     
    	else
    	{
    		echo "<script>alert(\" Redirection vers la page d'accueil. \")</script>";
    		echo "<SCRIPT>document.location.href='index.php'</SCRIPT>";
    	}
    ?>
     
    <!DOCTYPE html>
    <meta charset="utf-8"/>
    <link rel="stylesheet" type="text/css" href="style/style.css" charset="utf-8" />
    <html>
    	<head>
    		<title>Mot de passe oublié</title>
    	</head>
    		<form id="formulaire" action="" method ="POST" >
    			<!--Permet de créer les champs d'écritures -->
    			<fieldset>
    				<label for="mdp">Nouveau mot de passe </label>
    				<input type="password" name="mdp" placeholder="Mot de passe" required pattern="^.{6,}$" oninvalid="setCustomValidity('Votre mot de passe doit contenir au minimum 6 caractères')" onchange="try{setCustomValidity('')}catch(e){}" /><br>
    				<label for="rmdp">Répéter mot de passe </label>
    				<input type="password" name="rmdp" placeholder="Répéter mot de passe" required pattern="^.{6,}$"><br>
    			</fieldset>
    			<center><p><input value="" type="submit" name="submit5" id="submit5"></p></center>
     
    </html>
     
     
    <?php
    	if(isset($_POST['submit5']))
    	{	
    		//Vérifie si les mots de passes sont égaux dans le formulaire, change le mdp et génére un nouveau token dans la bdd puis redirige vers l'accueil.
    		if ($_POST['mdp'] == $_POST['rmdp'])
    		{
     
    			$sql = 'UPDATE `bdd`.`inscription` 
    			SET `mdp` = "'.sha1($_POST['mdp']).'",
    			`token` = "'.sha1(uniqid(rand())).'"
    			WHERE token="'.$_GET['token'].'"';
    			$req = mysqli_query($connexion, $sql) or die ('Erreur sql !<br>'.$sql.'<br>'.mysql_error());
    			echo "<script>alert(\" Votre mot de passe à bien été modifié. \")</script>";
    			echo "<SCRIPT>document.location.href='index.php'</SCRIPT>";
     
    		}echo "<br><font size='3pt' face='cursive' color='red'><center><b>Les mots de passes ne sont pas identiques.</center></b></font></form>";
    	}
    ?>

    J'ai ces erreurs :

    Warning: mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given in C:\wamp\www\Site\mdpoublie.php on line 28

    et :

    Fatal error: Call to a member function execute() on a non-object in C:\wamp\www\Site\mdpoublie.php on line 30

  2. #22
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut
    Et ce code que je viens de tester fonctionne ! Par contre je ne sais pas pourquoi, pourrais-tu m'expliquer ?

    Code php : 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
    <?php include("bdd/connexionBD.php"); ?>
     
    <?php
     
    	//Récupération du token depuis la variable $_GET
    	$token = $_GET['token'];
     
    	//Vérification de l'existance du token dans la base de données
    	$sql = 'SELECT token FROM `bdd`.`inscription` WHERE token= ?';
     
        $prepa = mysqli_prepare($connexion, $sql);				//Prépare la requète.
     
        mysqli_stmt_bind_param($prepa ,'s', $token);			//Lie les variables à la requête précédement inscrite.
     
        $prepa->execute();										//Execute la requête.
     
        $resultat = mysqli_stmt_fetch($prepa);					//Retourne le résultat de la requête.
     
     
    	if ($resultat)
    	{	
    		echo "<font size='5pt' face='cursive' color='#4163E1'><center><b>Vous pouvez changer votre mot de passe.</center></b></font>";
     
    		$sql = 'SELECT mdp FROM `bdd`.`inscription` WHERE mdp= ?';
     
    	    $prepa = mysqli_prepare($connexion, $sql);			//Prépare la requète.
    	}
     
    	else
    	{
    		echo "<script>alert(\" Redirection vers la page d'accueil. \")</script>";
    		echo "<SCRIPT>document.location.href='index.php'</SCRIPT>";
    	}
    ?>
     
    <!DOCTYPE html>
    <meta charset="utf-8"/>
    <link rel="stylesheet" type="text/css" href="style/style.css" charset="utf-8" />
    <html>
    	<head>
    		<title>Mot de passe oublié</title>
    	</head>
    		<form id="formulaire" action="" method ="POST" >
    			<!--Permet de créer les champs d'écritures -->
    			<fieldset>
    				<label for="mdp">Nouveau mot de passe </label>
    				<input type="password" name="mdp" placeholder="Mot de passe" required pattern="^.{6,}$" oninvalid="setCustomValidity('Votre mot de passe doit contenir au minimum 6 caractères')" onchange="try{setCustomValidity('')}catch(e){}" /><br>
    				<label for="rmdp">Répéter mot de passe </label>
    				<input type="password" name="rmdp" placeholder="Répéter mot de passe" required pattern="^.{6,}$"><br>
    			</fieldset>
    			<center><p><input value="" type="submit" name="submit5" id="submit5"></p></center>
     
    </html>
     
     
    <?php
    	if(isset($_POST['submit5']))
    	{	
    		//Vérifie si les mots de passes sont égaux dans le formulaire, change le mdp et génére un nouveau token dans la bdd puis redirige vers l'accueil.
    		if ($_POST['mdp'] == $_POST['rmdp'])
    		{
     
    			$sql = 'UPDATE `bdd`.`inscription` 
    			SET `mdp` = "'.sha1($_POST['mdp']).'",
    			`token` = "'.sha1(uniqid(rand())).'"
    			WHERE token="'.$_GET['token'].'"';
    			$req = mysqli_query($connexion, $sql) or die ('Erreur sql !<br>'.$sql.'<br>'.mysql_error());
    			echo "<script>alert(\" Votre mot de passe à bien été modifié. \")</script>";
    			echo "<SCRIPT>document.location.href='index.php'</SCRIPT>";
     
    		}echo "<br><font size='3pt' face='cursive' color='red'><center><b>Les mots de passes ne sont pas identiques.</center></b></font></form>";
    	}
    ?>

    Maintenant une page avec un mauvais token renvoie à l'accueil.

  3. #23
    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
    Par défaut
    A quoi sert la requête ligne 24 ?

    Dans ta requête ligne 63 tu as encore une faille de sécurité puisque tu ne sécurises pas les données venant de $_GET.
    De plus, tu re-genères un token, il faut plutôt l'effacer - il faut evidemment refuser un token vide dans ton traitement de changement de mot de passe.

    Pour finir, tu fais tes redirections en javascript, ce qui veut dire que si l'utilisateur desactive javascript, il arrivera sur le formulaire quand meme.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #24
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut
    Je n'ai même pas pensé aux failles des redirections avec javascript, merci.

    Non je parlais de la ligne 26, c'est en mettant cette ligne que la vérification du token dans la base de donnée c'est faite, en l'enlevant mon code ne fonctionnait pas comme prévu.

    Comment je fais pour sécuriser ma ligne 63 ? Que veux tu dire par "faille de sécurité" ? Qu'est ce qu'il peut se passer si je ne sécurise pas ?

    J'ai modifié le token car je ne savais pas comment le supprimer tout en gardant le traitement, justement d'un token vide interdit dans mon formulaire.

    Merci beaucoup pour ton aide en tout cas.

  5. #25
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    petite(s) question(s) en passant :
    • De quoi se compose la table des membres en BdD ? Existe-t-il au moins le champ "email" ?
    • vérifies-tu (à l'inscription) que l'email fourni est bien unique ? (dans beaucoup de sites, tu verras que c'est l'email qui sert d'identifiant/login)

    Donc :
    "email perdu" :
    1/ le visiteur remplit le formulaire -> avec son email
    2/ tu vérifies si cet email est bien dans la BdD !
    3/ Si ok :
    -> tu génères un token, unique.
    -> tu enregistres ce token en BdD : "UPDATE ..... SET token = ".$token_genere." WHERE email =".$email_fourni.";"
    -> tu envoies en retour un email, avec un lien pour réinitialiser : "www.mon_site.com/newpwdinit.php?token=...."
    3/ quand ce lien est cliqué, tu récupères :
    -> le token : $_GET['token']
    4/ le SELECT se fait alors sur "WHERE token = ".$token_recup
    token unique -> email unique -> tu donnes accès au formulaire de modification de la fiche du membre, pour qu'il puisse modifier son mot de passe.

  6. #26
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut
    Oui j'ai un champ email dans ma bdd :

    http://www.noelshack.com/2015-02-1420469923-capture.png

    Oui je vérifie si le mail existe dans la base mais j'ai une erreur, voici d'abord le code :

    Code php : 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
    <?php
    include "BDD/identifiant.php"; 
    require ("class/class.phpmailer.php");
     
    if(isset($_POST['submit']))
    {
    	include "connexionBD.php";
     
    	//Les différents input.
     	$pseudo = utf8_decode($_POST['pseudo']);
    	$mdp = sha1($_POST['mdp']);
    	$rmdp = sha1($_POST['rmdp']);
    	$email = utf8_decode($_POST['email']);
    	$nom = utf8_decode($_POST['nom']);
    	$prenom = utf8_decode($_POST['prenom']);
    	$annee = ($_POST['annee']);
    	$sexe = utf8_decode($_POST['sexe']);
    	$adresse = utf8_decode($_POST['adresse']);
    	$cp = utf8_decode($_POST['cp']);
    	$ville = utf8_decode($_POST['ville']);
    	$telephone = utf8_decode($_POST['telephone']);
    	$categorie = utf8_decode($_POST['categorie']);
    	$type_licence = utf8_decode($_POST['type_licence']);
    	@$club = utf8_decode($_POST['club']);					//On masque l'erreur car ces champs de textes peuvent être grisé.
    	@$licence = utf8_decode($_POST['licence']);
    	$compte = utf8_decode($_POST['compte']);
     
    	// Vérification si deux pseudo sont identiques dans la bade de données.
    	$req = 'SELECT pseudo FROM `bdd`.`inscription` WHERE pseudo = ?';
     
            $prepa = mysqli_prepare($connexion, $req);			//Prépare la requète.
     
            mysqli_stmt_bind_param($prepa ,'s', $pseudo);			//Lie les variables à la requête précédement inscrite.
     
            $prepa->execute();								//Execute la requête.
     
            $resultat = mysqli_stmt_fetch($prepa);				//Retourne le résultat de la requête.
     
    	if ($resultat)									//Vérifie si le pseudo existe.
    	{
    	    echo '<center><p id="mauvais">Pseudo déjà existant, veuillez en entrer un autre.</center></p><br>';
    	}
     
    	// Vérification si deux emails sont identiques dans la bade de données.
    	$req = 'SELECT email FROM `bdd`.`inscription` WHERE email = ?';
     
        $prepa = mysqli_prepare($connexion, $req);				//Prépare la requète.
     
        mysqli_stmt_bind_param($prepa ,'s', $email);			//Lie les variables à la requête précédement inscrite.
     
        $prepa->execute();										//Execute la requête.
     
        $resultat = mysqli_stmt_fetch($prepa);					//Retourne le résultat de la requête.
     
    	if ($resultat)											//Vérifie si le mail existe.
    	{
    	    echo '<center><p id="mauvais">Email déjà éxistante, veuillez en entrer une autre.</center></p><br>';
    	}
     
    	else if ($mdp == $rmdp)
    	{
    		//Si tout est correct, on rentre les valeurs dans la base.
    	 	$sql = "INSERT INTO `bdd`.`inscription` (`id`, `pseudo`, `mdp`, `email`, `nom`, `prenom`, `annee`, `sexe`, `adresse`, `cp`, `ville`, `telephone`, `categorie`, `type_licence`, `club`, `licence`, `compte`)
    	 			VALUES ('', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; //Chaque ? représente une variable dans l'ordre indiquer dans la requete sql.
     
    	 	$stmt = mysqli_prepare($connexion, $sql);
     
    		//Paramètres : chaines de caractères dans l'ordre - Permet de renseigner les paramètres repéré par les "?" dans l'ordre.
    		mysqli_stmt_bind_param($stmt, 'ssssssssssssssss', $pseudo , $mdp, $email, $nom, $prenom, $annee, $sexe, $adresse, $cp, $ville, $telephone, $categorie, $type_licence, $club, $licence, $compte);
     
    		//Exécution
    		mysqli_stmt_execute($stmt);	//Execute la requête.
    		echo "<center><p>Inscription réussi.</center></p><br>";
     
    	}else echo '<center><p id="mauvais">Les mots de passes ne sont pas identiques.</center></p><br>';
    }
    ?>

    L'erreur, c'est soit je vérifie si le pseudo existe ou soit je vérifie si l'adresse mail existe, si j'insère les deux tâches en même temps j'ai des erreurs :

    Pour le pseudo déjà existant ça m'affiche ces erreurs mais l'inscription ne s’exécute pas :

    http://www.noelshack.com/2015-02-1420470843-capture.png

    Pour le mail déjà existant tout est correct :

    http://www.noelshack.com/2015-02-1420470714-capture.png

    La page de réinitialisation mot de passe fonctionne :

    Première étape : La génération du token + l'envoie du mail à l'utilisateur si celui-ci existe ce fait comme suit :

    Code php : 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
    <?php
    	if (isset($_POST['email']))
    	{
    		include "bdd/connexionBD.php";
     
    		//Met à jour la base de donnée du membre en y insérant un token (jeton).
    		$email = utf8_decode($_POST['email']);
    		$token = sha1(uniqid(rand()));
     
    		$sql = 'UPDATE `bdd`.`inscription` SET `token` = "'.$token.'" WHERE email="'.$_POST['email'].'"';
    		$req = mysqli_query($connexion, $sql) or die ('Erreur sql !<br>'.$sql.'<br>'.mysql_error());
     
    		//Vérifie si le mail existe.
    		$req = 'SELECT email FROM `bdd`.`inscription` WHERE email = ?';
     
    	    $prepa = mysqli_prepare($connexion, $req);				//Prépare la requète.
     
    	    mysqli_stmt_bind_param($prepa ,'s', $email);			//Lie les variables à la requête précédement inscrite.
     
    	    $prepa->execute();										//Execute la requête.
     
    	    $resultat = mysqli_stmt_fetch($prepa);					//Retourne le résultat de la requête.
     
    		if ($resultat)											//Vérifie si le mail existe.
    		{
    			$to = $email;
    			$sujet = 'Oublie du mot de passe';
    			$body = 'Bonjour, vous avez oubliez votre mot de passe, cliquer sur le lien présent pour le réinitialiser : http://localhost/site/mdpoublie.php?token='.$token.'';
     
    			function smtpmailer($to,$sujet,$body)
    			{
    				global $error;
    				$envoiemail = new PHPMailer();
    				$envoiemail->IsSMTP(); 		// active SMTP
    				$envoiemail->SMTPDebug = 1;	// debogage: 1 = Erreurs et messages, 2 = messages seulement
    				$envoiemail->FromName = "SAYED Mohsin";
    				$envoiemail->SMTPAuth = true;  // Authentification SMTP active
    				$envoiemail->SMTPSecure = 'ssl'; // Gmail REQUIERT Le transfert securise
    				$envoiemail->Host = 'smtp.gmail.com';
    				$envoiemail->Port = 465;
    				$envoiemail->Username = "monmail";
    				$envoiemail->Password = "azerty1992";
    				$envoiemail->Subject = $sujet;
    				$envoiemail->Body = $body;
    				$envoiemail->AddAddress($to);
    				if($envoiemail->Send())
    				{
    					$error = 'Mail error: '.$envoiemail->ErrorInfo;
    					return false;
    				} 
    				else 
    				{
    					$error ='Message sent';
    					return true;
    				}
    			}
    			smtpmailer($to,$sujet,$body);
    			echo "<center><p>Un mail vous a été envoyé à l'adresse indiqué.</center></p><br>";
    		}
    		else
    		{
    			echo "<center><p id='mauvais'>Adresse mail non inscrite.</p></center><br>";
    		}
    	}
    ?>


    La page de réinitialisation du mot de passe comme ceci :

    Code php : 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
    <?php include("bdd/connexionBD.php"); ?>
     
    <?php
     
    	//Récupération du token depuis la variable $_GET
    	$token = $_GET['token'];
     
    	//Vérification de l'existance du token dans la base de données
    	$sql = 'SELECT token FROM `bdd`.`inscription` WHERE token= ?';
     
        $prepa = mysqli_prepare($connexion, $sql);				//Prépare la requète.
     
        mysqli_stmt_bind_param($prepa ,'s', $token);			//Lie les variables à la requête précédement inscrite.
     
        $prepa->execute();										//Execute la requête.
     
        $resultat = mysqli_stmt_fetch($prepa);					//Retourne le résultat de la requête.
     
     
    	if ($resultat)
    	{	
    		echo "<font size='5pt' face='cursive' color='#4163E1'><center><b>Vous pouvez changer votre mot de passe.</center></b></font>";
     
    		$sql = 'SELECT mdp FROM `bdd`.`inscription` WHERE mdp= ?';
     
    	    $prepa = mysqli_prepare($connexion, $sql);			//Prépare la requète.
    	}
     
    	else
    	{
    		header('Location: index.php');
    	}
    ?>
     
    <!DOCTYPE html>
    <meta charset="utf-8"/>
    <link rel="stylesheet" type="text/css" href="style/style.css" charset="utf-8" />
    <html>
    	<head>
    		<title>Mot de passe oublié</title>
    	</head>
    		<form id="formulaire" action="" method ="POST" >
    			<!--Permet de créer les champs d'écritures -->
    			<fieldset>
    				<label for="mdp">Nouveau mot de passe </label>
    				<input type="password" name="mdp" placeholder="Mot de passe" required pattern="^.{6,}$" oninvalid="setCustomValidity('Votre mot de passe doit contenir au minimum 6 caractères')" onchange="try{setCustomValidity('')}catch(e){}" /><br>
    				<label for="rmdp">Répéter mot de passe </label>
    				<input type="password" name="rmdp" placeholder="Répéter mot de passe" required pattern="^.{6,}$"><br>
    			</fieldset>
    			<center><p><input value="" type="submit" name="submit5" id="submit5"></p></center>
     
    </html>
     
     
    <?php
    	if(isset($_POST['submit5']))
    	{	
    		//Vérifie si les mots de passes sont égaux dans le formulaire, change le mdp et génére un nouveau token dans la bdd puis redirige vers l'accueil.
    		if ($_POST['mdp'] == $_POST['rmdp'])
    		{
     
    			$sql = 'UPDATE `bdd`.`inscription` 
    			SET `mdp` = "'.sha1($_POST['mdp']).'",
    			`token` = "'.sha1(uniqid(rand())).'"
    			WHERE token="'.$_GET['token'].'"';
    			$req = mysqli_query($connexion, $sql) or die ('Erreur sql !<br>'.$sql.'<br>'.mysql_error());
    			echo "<script>alert(\" Votre mot de passe à bien été modifié. \")</script>";
    			echo "<SCRIPT>document.location.href='index.php'</SCRIPT>";
     
    		}echo "<br><font size='3pt' face='cursive' color='red'><center><b>Les mots de passes ne sont pas identiques.</center></b></font></form>";
    	}
    ?>

  7. #27
    Invité
    Invité(e)
    Par défaut
    Quelques corrections :

    1/ Pour la récupération de TOUS tes champs, au lieu de (il n'est jamais bon de "masquer" une erreur : il faut la traiter) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	@$club = utf8_decode($_POST['club']);					//On masque l'erreur car ces champs de textes peuvent être grisé.
    écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$club = ( isset($_POST['club']) )? utf8_decode($_POST['club']) : '';
    C'est ce qu'on appelle une condition ternaire : var = ( condition )? [valeur si vrai] : [valeur si faux] ;
    qui est un raccourci de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if( isset($_POST['club']) ){ $club = utf8_decode($_POST['club']); } else { $club = ''; }
    2/ comme un id DOIT être UNIQUE, et que <center> est obsolète, remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <center><p id="mauvais">............</p></center>
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p class="mauvais">............</p>
    avec dans le CSS :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    .mauvais {
     text-align:center;
     /* ...autres attributs */
    }

    3/ idem ici <font...> est obsolète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		echo "<font size='5pt' face='cursive' color='#4163E1'><center><b>Vous pouvez changer votre mot de passe.</center></b></font>";
    à remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		echo '<span class="txt-change-mdp">Vous pouvez changer votre mot de passe.</span>';
    et dans le CSS :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    .txt-change-mdp {
    	font-size:75%; /* éviter les pt. c'est mieux en % ou em */
    	font-family:cursive;
    	font-weight:bold;
    	color:#4163E1;
    	text-align:center;
    }
    N.B. tu remarqueras que j'ai interverti apostrophes et guillemets (par habitude perso).
    Sinon, il faut échapper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		echo "<span class=\"txt-change-mdp\">Vous pouvez changer votre mot de passe.</span>";
    Dernière modification par Invité ; 05/01/2015 à 22h22.

  8. #28
    Invité
    Invité(e)
    Par défaut
    Voici une méthodologie de traitement et affichage d'un formulaire sur la même page :
    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
    <?php
    	$form_ok = 0; // par défaut
    	$err_message = ''; // par défaut
     
    if( isset($_POST['submit']) )
    {
    	------------------------
    	1/ Récupération des variables
    	------------------------
    	$var1 = ( isset($_POST['var1']) )?  htmlspecialchars( $_POST['var1'], ENT_QUOTES, 'UTF-8' ) : '';
    	$var2 = ( isset($_POST['var2']) )?  htmlspecialchars( $_POST['var2'], ENT_QUOTES, 'UTF-8' ) : '';
    	// ....
     
    	------------------------
    	2/ GESTION des ERREURS
    	------------------------
    	// vérification 1
    	if(....condition1.....){
    		// .....
    		$err_message .= '...............<br/>';
    		$form_ok = 2;
    	}
    	// vérification 2
    	if(....condition2.....){
    		// .....
    		$err_message .= '...............<br/>';
    		$form_ok = 2;
    	}
    	// vérification 3
    	if(....condition3.....){
    		// .....
    		$err_message .= '...............<br/>';
    		$form_ok = 2;
    	}
    	if( $form_ok != 2 ){
    		$form_ok == 1; // pas d'erreur
    	}
     
    	------------------------
    	3/ TRAITEMENT
    	------------------------
    	// OK ? on traite
    	if( $form_ok == 1 ){
    		// traitement ........
    		// ........
     
    	}
    }
    ?>
    (ici, on démarre la page html : doctype, head,....)
    <?php
    ------------------------
    // erreur traitement ?
    if( $form_ok == 2 ){
    		echo '<p class="mauvais">Merci de corriger les erreurs :<br />'.$err_message.'</p>';
    }
    ------------------------
    // traitement OK ?
    elseif( $form_ok == 1 ){
    		echo '<p class="ok">Tutti va bene !</p>';
    }
    ------------------------
    // sinon, affichage du formulaire
    else {
    	// .... (formulaire)
    }
    ------------------------

  9. #29
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut
    Merci pour ton aide !

    J'ai corrigé tout ce que tu m'as dis dans ton premier commentaire, à savoir :

    - Utiliser une condition ternaire au lieu de masquer les erreurs (je ne connaissais même pas ce terme).

    - Enlever les balise pour y mettre, à la place, du code CSS.

    - Juste une question à ce niveau, mettre un "." ou un "#" avant un id en CSS reviens à la même chose ?

    J'avais d'autres lignes de codes du même genre que j'ai corrigé grâce à toi merci.

    Par contre pour ton deuxième commentaire qui traite sur "la méthodologie de traitement et l'affichage d'un formulaire sur la même page" je n'ai pas compris de quel formulaire tu parles.

  10. #30
    Invité
    Invité(e)
    Par défaut
    1/
    Citation Envoyé par mitsukk1992 Voir le message
    ... mettre un "." ou un "#" avant un id en CSS reviens à la même chose ?...
    • "#" pour un identifiant : id="...." -> UNIQUE = 1 seul élément
    • "." pour une classe : class="...." -> peut être appliqué à plusieurs éléments

    Pour ça, je t'invite à lire les cours de CSS. Voir aussi les tutoriels et cours de formation pour apprendre la programmation PHP.

    2/ "méthodologie ..." : s'applique à n'importe quel formulaire !

  11. #31
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Par défaut
    Au fait je ne vois pas trop de comment je pourrais mettre la vérification de "si le pseudo existe dans la bdd", du genre "if($req = 'SELECT pseudo FROM `bdd`.`inscription` WHERE pseudo = ?')" (ce n'est sûrement pas ça).

    Aussi, on m'a dit que mes requêtes SQL dans cette partie ne sont pas sécurisé :

    https://wall.deblan.org/x1c94/php/1/

    Quel lignes de code dois-je écrire pour qu'elles le soient ? De quoi parles t’ont quand on parle de "faille sql" ?

  12. #32
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mitsukk1992 Voir le message
    vérification de "si le pseudo existe dans la bdd"
    Si la requête "SELECT pseudo FROM `bdd`.`inscription` WHERE pseudo = [le_pseudo_recu]" renvoie un nombre de ligne > 0, alors il existe !
    Citation Envoyé par mitsukk1992 Voir le message
    De quoi parles t’ont quand on parle de "faille sql" ?

Discussions similaires

  1. Formulaire Mot de passe oublié JavaScript & PHP
    Par goku19 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/01/2012, 09h21
  2. Réponses: 17
    Dernier message: 29/04/2008, 21h53
  3. [authentification]mot de passe oublié
    Par dash dans le forum Access
    Réponses: 5
    Dernier message: 08/12/2005, 11h35
  4. mot de passe oublié
    Par sami1881 dans le forum Sécurité
    Réponses: 5
    Dernier message: 25/11/2005, 00h04
  5. cryptage assymetrique de mot de passe(javascript/PHP)
    Par chess132 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 25/10/2005, 13h04

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