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. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut Mot de passe oublié PHP
    Bonjour,

    J'aimerais envoyer un mail à un utilisateur qui s'est inscris dans mon site lorsqu'il a oublié son mot de passe, mon formulaire :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <fieldset>
    	<legend>Mot de passe oublié ?</legend>
    	<label for="email">Email</label>
    	<input name="email" placeholder="Mail@domain.com" type="email"><br>
    </fieldset>

    Pour envoyer un mail il faut bien que notre script php reconnaisse notre mot de passe de notre adresse email, le truc c'est que j'ai aucune idée de comment cela est possible.

    Merci de votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2012
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2012
    Messages : 416
    Points : 746
    Points
    746
    Par défaut
    Bonjour,

    Par principe, il ne faut pas stocker les mots de passe en clair. Ils sont donc normalement chiffrés.

    Lorsqu'un utilisateur perd son mot de passe, la procédure habituelle est de lui envoyer un lien par email qui lui permettra de modifier son mot de passe.
    Il ne faut en aucun cas lui envoyer son mot de passe actuel par email.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    Merci valaendra pour la rapidité de ta réponse, il est "facile" d'envoyer un lien de changement de mot de passe à l'utilisateur rien qu'avec son adresse mail ? Je n'ai aucune idée de par ou commencer ...

  4. #4
    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
    Tout dépend de la modélisation de ta base de donnée
    Tu peux faire quelques choses de très simple comme rajouter un attribut "forgetPass" dans ta table Users par exemple.
    Tu stock dans cette attribut un clé unique ! Et donc tu envoie dans l'email un lien avec par exemple comme url password.php?key=kDk47D41dstD587i&id=45
    Qui vérifie si la clé est bien la bonne pour l'id "45" (Par exemple)

    C'est la méthode la plus simple, à toi de voir comment améliorer ça

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Dumbeldor donne effectivement une pratique simple, bien que personnellement je préfère génerer un identifiant unique en fonction par exemple du pseudo de l'utilisateur + son mail + le timestamp concaténé et hashé, plutot que d'envoyer directement un id utilisateur dans un email.

    Sinon pour ajouter un peu de sécurité, vous pouvez aussi ajouter dans la table utilisateur un flag (un champs boolean) qui indique si l'utilisateur vient de modifier son mot de passe, a mettre à 1 quand il clique sur "mot de passe oublié" et le mettre a 0 lorsqu'il vient de changer le mot de passe, cela permettra d'éviter que l'utilisateur puisse changer son mot de passe a volonté via le mail qui lui a été envoyé.

    On peut aussi stocké la date d'oublie (ou de modification) etc si on veut avoir des statistiques.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    Merci pour vos réponses elles m'ont aidé à mieux comprendre le problème le soucis est au niveau du code, je n'ai aucune idée de par où commencer, je débute en php.

  7. #7
    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
    1 - ajouter une colonne char(13) dans ta table utilisateur qui permettra de stocker le jeton de reinitialisation
    2 - un formulaire "mot de passe oublié" avec un champ pour l'adresse email
    3 - une page de traitement de ce formulaire qui inscrit un uniqid() dans la colonne crée en 1 pour l'utilisateur correspondant à l'email et qui envoi un mail à l'utilisateur avec un lien contenant le jeton : http://tonsite/reinitialisation.php?...=4b3403665fea6
    4 - un formulaire qui demande un nouveau mot de passe (notre reinitialisation.php du point 3) ; le formulaire doit retransmettre également le token et l'email qui ont été reçus par le lien.
    5 - un page de traitement du formulaire 4 : si le token et l'email correspondent aux informations dans la base de donnée, on met à jour le mot de passe et on efface le token de la colonne pour cet utilisateur.

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Points : 93
    Points
    93
    Par défaut
    Je ne donnerais pas le code exact mais l'algorithme a suivre, ca devrait etre facilement codable après.

    Après que l'utilisateur ai mis un email et cliqué sur envoyé

    Page Forget.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
     
    <?php
    //Récuperer email depuis variable $_POST
    $email = $_POST["mail"];
    //Verification existance de l'email sur la base de données
    $query = db_query("SELECT WHERE mail =".$email);
    $exist = count($query) == 1;
    //Si le mail existe
    if($exists){
    //Génerer un token unique et le stocker dans la base de données
    //Créer le message a envoyer par mail avec un lien menant vers la page permettant la modification de mot de passe
    //Envoyer le mail
    //Rediriger vers une page confirmant l'envoie d'email
    }else{ //Sinon
    //Rediriger vers la page précédent, ajouter un message d'erreur comme quoi l'utilisateur n'existe pas
    } 
    ?>
    //Page modification password

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //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 + vérification de date de demande de nouveau mot de passe + vérification de changement déjà effectué.
    $query = db_query("SELECT WHERE token ='$token'");
    if(count($query) == 1 && $query[0]["flag"] == 1 && strtotime($query[0]["date_demande"]) > time()-(3600*24)){
    //Affichage du formulaire de changement de mot de passe
    }else{
    //Redirectionvers page d'erreur
    }
    //Page update mot de passe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Récupération du mot de passe
    //Verification du token
    //Mise a jour de la base de données (changement mot de passe + mise a 0 du flag)
    Voila ca devrait t'aider je pense

    EDIT : avec le message de sabotage (qui m'a devancé >.<), tu as tout les moyens qu'il faut maintenant :p

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    Désolé, merci pour tous vos détails mais comme dit plus haut, je débute vraiment en php et j'ai du mal à comprendre ce que vous me dîtes :s

    Je ne sais pas ce que c'est un token et commet l'utilisé pour mon cas.
    L'adresse email avec laquelle vont être envoyé les messages doit être codés en dure ?

  10. #10
    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
    un token, un jeton, c'est l'élement que tu donnes à l'utilisateur pour lui permettre de s'authentifier provisoirement.
    Dans notre exemple, tu envoies à l'utilisateur un code aleatoire par mail. Pour pouvoir donner un nouveau mot de passe, l'utilisateur doit fournir le code reçu par mail.

    L'adresse email avec laquelle est envoyé le mail n'a aucune importance.

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 60
    Points : 93
    Points
    93
    Par défaut
    un jeton ou un token est plus exactement une chaine de caractère généré alétaoirement et unique !!!! Un genre de code secret que l'utilisateur doit te remettre pour te prouver son identité

    tu peux en construire un avec sha1($pseudo+$email+time()); par exemple.


    la fonction time(); te renvoie le timestamp actuel.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    C'est censé être simple ? Car j'ai vraiment du mal ...

  13. #13
    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
    Dans les 5 points que j'ai donné tu as fait quoi ?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    Merci pour ta réponse rapide et désolé de pour ma lenteur.

    Donc j'ai déjà essayer d'envoyer un mail en php mais je n'y arrive pas :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $token = sha1(uniqid(rand()));
    //Envoie un mail de confirmation.
    $to = $email;
    $sujet = 'Activation de votre compte';
    $body = 'Bonjour, veuillez activer votre compte en cliquant ici -> <a href="activation.php?token='.$token.'$email='.$to.'">Activation du compte</a>';
    $entete = 'MIME-Version: 1.0\r\n';
    $entete .= 'Content-type: text/html; charset=utf-8\r\n';
    $entete .= 'From: Course à pied' . '\r\n' .
        'Reply-To: <a href="mailto:monmail@free.fr">monmail@free.fr</a>' . '\r\n' .
        'X-Mailer: PHP/' . phpversion();
    mail($to,$sujet,$body,$entete);

    J'ai une erreur
    Failed to connect to mailserver at &quot;localhost&quot; port 25, verify your &quot;SMTP&quot; and &quot;smtp_port&quot; setting in php.ini or use ini_set()
    Je pense pouvoir régler cette erreur en cherchant un peu sur le net mais je ne veux pas utiliser le mail de mon FAI (je crois que c'est ça) pour envoyer mes mails mais une adresse mail que j'aurais créer (avec gmail, hotmail ou autre) au préalable et c'est pour cela que je demandais si il fallait inscrire son mot de passe directement dans le code php.

  15. #15
    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
    Il n'y a pas de lien obligatoire entre l'adresse email de l'expediteur et le smtp utilisé.
    Tu peux envoyer un email depuis une adresse gmail avec le SMTP de Orange.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    Je reprends le sujet car j'ai réussi à avancer, il me manque juste une dernière étape qui est la sélection du mot de passe de l'utilisateur quand celui-ci est dans le formulaire de modification du mot de passe.

    J'ai généré un token comme ceci :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $token = sha1(uniqid(rand()));

    Il s'insère dans la base de donnée lorsque l'utilisateur inscris sont mail dans le formulaire du mot de passe oublié.

    Voici la partie php de ce formulaire jusque là tout fonctionne :

    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
    <?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 = "Course";
    			$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 = "mon passe";
    			$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);
    	}
    	else
    	{
    		echo "<center><p id='mauvais'>Adresse mail non inscrite.</p></center><br>";
    	}
    }
    ?>

    Le problème viens donc du formulaire de modification du mot de passe, je n'arrive pas à retiré de la base de donnée le mot de passe actuel de l'utilisateur pour un UPDATE, voici mon 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
    <?php include "BDD/connexionBD.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 + vérification de date de demande de nouveau mot de passe + vérification de changement déjà effectué.
    	$req = 'SELECT token FROM `bdd`.`inscription` WHERE token = ?';
     
        $prepa = mysqli_prepare($connexion, $req);				//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 token ="'.$_GET['token'].'"';
    		$req = mysqli_query($connexion, $sql) or die ('Erreur SQL<br>'.$sql.'<br>'.mysql_error());
    	}
     
    	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" method = "POST" action="">
    			<!--Permet de créer les champs d'écritures -->
    			<fieldset>
    				<label for="mdp">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="submit" id="submit"></p></center>
    		</form>
    </html>

    J'ai bien la phrase à partir de l'echo à la ligne 19 mais ensuite, j'ai mon erreur SQL qui s'affiche :

    "Erreur SQL
    SELECT mdp FROM `bdd`.`inscription` WHERE token ="7477cf8214681cbd71a63565e44b230aeddf645d" "

    Merci de votre aide.

  17. #17
    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
    C'est mysqli_error et pas mysql_error.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    Merci de ta réponse, entre temps j'ai fais ces modifications :

    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
    <?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)
    	{	
     
    	}
     
    	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>
    		</form>
    </html>
     
     
    <?php
    	if(isset($_POST['submit5']))
    	{		
    		$sql = 'UPDATE `bdd`.`inscription` SET `mdp` = "'.sha1($_POST['mdp']).'" WHERE token="'.$_GET['token'].'"';
    		$req = mysqli_query($connexion, $sql) or die ('Erreur sql !<br>'.$sql.'<br>'.mysql_error());
    	}
    ?>

    La ça fonctionne mais tout le monde peut accéder à la page de modification de mot de passe en tapant juste le lien suivi de token=1 (si on ne met rien après le égale, on va dans le else).

    Je n'arrive pas à insérer ma condition.

    Pour mysqli_error en mysql_error il me met cette erreur :

    "mysqli_error() expects parameter 1 to be mysqli, string given"

    De plus, j'ai utilisé la même chose pour la modification des comptes et ça fonction, c'est quand je met la requête dans un if que l'erreur s'affiche.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 236
    Points : 61
    Points
    61
    Par défaut
    Ok c'est parce que je ne vérifie pas que le token existe ... Comment faire pour ?

    Si je fais ça :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	//Vérification de l'existance du token dans la base de données + vérification de date de demande de nouveau mot de passe + vérification de changement déjà effectué.
    	$req = 'SELECT token FROM `bdd`.`inscription` WHERE token = ?';
     
        $prepa = mysqli_prepare($connexion, $req);				//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.

    Ma ligne :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT mdp FROM `bdd`.`inscription` WHERE token ="'.$_GET['token'].'", mdp = ?';

    M'indique une erreur.

  20. #20
    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
    On ne met jamais directement dans une requête des données venant d'un utilisateur; c'est un grave trou de sécurité.
    Ta requête $sql doit être préparée comme ta requête $req.

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