Hashage md5
123xenia
Messages postés
5
Statut
Membre
-
123xenia Messages postés 5 Statut Membre -
123xenia Messages postés 5 Statut Membre -
Bonjour,
Je prends la suite de ce topic :
https://forums.commentcamarche.net/forum/affich-17425573-php-encoder-les-mots-de-passe-en-md5
J'ai fait la manip, pas de souci, ça marche.
Seulement, en fin d'inscription, j'envoie un mail à l'utilisateur, avec rappel de son pseudo et MdP, et bien évidemment, il reçoit le MdeP hashé 32 caractères lol.
Comment faire pour désencoder avant l'envoi, pour qu'il puisse lire en clair ?
Merci !
Je prends la suite de ce topic :
https://forums.commentcamarche.net/forum/affich-17425573-php-encoder-les-mots-de-passe-en-md5
J'ai fait la manip, pas de souci, ça marche.
Seulement, en fin d'inscription, j'envoie un mail à l'utilisateur, avec rappel de son pseudo et MdP, et bien évidemment, il reçoit le MdeP hashé 32 caractères lol.
Comment faire pour désencoder avant l'envoi, pour qu'il puisse lire en clair ?
Merci !
A voir également:
- Hashage md5
- Md5 checksum - Télécharger - Web & Internet
- Md5 windows - Télécharger - Gestion de fichiers
- Ouvrir fichier md5 - Télécharger - Gestion de fichiers
- MST MD5 - Télécharger - Gestion de fichiers
- Md5 en PHP ✓ - Forum PHP
7 réponses
C'est très simple. Toi, tu hash en md5 son mot de passe.
Un truc du genre ça:
$pass = md5(mysql_real_escape_string(htmlspecialchars($_POST['pass'])));
En revanche, $_POST['pass'] n'est pas hashé. Donc quand tu fais la fonction mail() tu envoies $_POST['pass'] et non $pass.
J'espère que je t'aurai bien aiguillé...
Un truc du genre ça:
$pass = md5(mysql_real_escape_string(htmlspecialchars($_POST['pass'])));
En revanche, $_POST['pass'] n'est pas hashé. Donc quand tu fais la fonction mail() tu envoies $_POST['pass'] et non $pass.
J'espère que je t'aurai bien aiguillé...
Bon, ça le fait pas ....
j'ai bien hashé avec le script que tu me montres, mais ça veut pas avaler $_POST['pass']
Sur le formulaire d'inscription, ça me renvoie une erreur sans aucun rapport : votre login ne doit pas dépasser 60 caractères !
J'ai l'impression qu'il me faudrait une variable avant le sendEmail pour dire que $pass = $_POST['pass'], mais je sais pas faire ça, je ne connais pas la syntaxe, ponctuation, etc ....
Merci de me dépanner
j'ai bien hashé avec le script que tu me montres, mais ça veut pas avaler $_POST['pass']
Sur le formulaire d'inscription, ça me renvoie une erreur sans aucun rapport : votre login ne doit pas dépasser 60 caractères !
J'ai l'impression qu'il me faudrait une variable avant le sendEmail pour dire que $pass = $_POST['pass'], mais je sais pas faire ça, je ne connais pas la syntaxe, ponctuation, etc ....
Merci de me dépanner
Serait-il possible de voir ton code un peu s'il te plaît ? ^^' (Formulaire et PHP surtout) et je pense que je pourrai t'aider :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Un mot de passe doit être hashé en utilisant sha256 plutot que md5 puis stocké. Une fois stocké il ne devra plus sortir de cet espace.
A la connexion le mot de passe reçu sera hashé de la même façon et c'est les hash qui seront comparé.
Pour ce qui est des mot de passe oublié il faut donner la possibilité de le redéfinir mais certainement pas envoyé le passe actuel par mail.
Il faut créer un liens unique par exemple : monsite.fr?passlost=a1254bf4554e445554cd541
avec par exemple
$_GET[passlost] = md5(mt_rand());
et envoyer ce liens par mail une fois lié au compte.
il faut également lui donner une durée de validité et le détruire quand il a été utilisé
A la connexion le mot de passe reçu sera hashé de la même façon et c'est les hash qui seront comparé.
Pour ce qui est des mot de passe oublié il faut donner la possibilité de le redéfinir mais certainement pas envoyé le passe actuel par mail.
Il faut créer un liens unique par exemple : monsite.fr?passlost=a1254bf4554e445554cd541
avec par exemple
$_GET[passlost] = md5(mt_rand());
et envoyer ce liens par mail une fois lié au compte.
il faut également lui donner une durée de validité et le détruire quand il a été utilisé
Je te montre mon code (page pas encore habillée)
[spoiler]
<?php
session_start();
$BDD = mysql_connect("xxxxxxxx","xxxxxxt","xxxxxxxx");
mysql_select_db("xxxxxxxxxxxxxt");
?>
<?php
// On met les variables utilisées dans le code PHP à FALSE (C'est-à-dire les désactiver pour le moment).
$error = FALSE;
$registerOK = FALSE;
$errorMSG = '';
// On regarde si l'utilisateur est bien passé par le module d'inscription
if(isset($_POST["register"])){
//--------------------------------------------------------------------
//Sécurisation
//--------------------------------------------------------------------
$login = htmlspecialchars(trim($_POST['login']));
$pass = md5(mysql_real_escape_string(htmlspecialchars(trim($_POST['pass']))));
$pass2 = md5(mysql_real_escape_string(htmlspecialchars(trim($_POST['pass2']))));
$mail = htmlspecialchars(trim($_POST['mail']));
//--------------------------------------------------------------------
// Vérifications
//--------------------------------------------------------------------
// On regarde si tous les champs sont remplis, sinon, on affiche un message à l'utilisateur.
if($login == NULL OR $pass == NULL OR $pass2 == NULL OR $mail == NULL){
// On met la variable $error à TRUE pour que par la suite le navigateur sache qu'il y'a une erreur à afficher.
$error = TRUE;
// On écrit le message à afficher :
$errorMSG .= "Tous les champs doivent être remplis !<br>";
}
// Sinon, si les deux mots de passe correspondent :
if($pass != $pass2){
$error = TRUE;
$errorMSG .= "Les deux mots de passe sont différents !<br>";
$pass = NULL;
}
// On regarde si le mot de passe et le nom de compte ne sont pas les mêmes
if($login == $pass){
$error = TRUE;
$errorMSG .= "Le nom de compte et le mot de passe doivent être différents !<br>";
}
// Si c'est bon on regarde dans la base de données si le nom de compte est déjà utilisé :
$sql = "SELECT login FROM users WHERE login = '".$login."' ";
$sql = mysql_query($sql);
// On compte combien de valeur à pour nom de compte celui tapé par l'utilisateur.
$sql = ($sql!==null && $sql!="")? mysql_num_rows($sql):0;
if($sql != 0){
$error = TRUE;
$errorMSG .= "Le pseudo <strong>".$login."</strong> est déjà utilisé !<br>";
$login = NULL;
}
// Si tout va bien on regarde si le mot de passe n'excède pas 60 caractères.
if(strlen($pass >= 32) || strlen($login >= 60)){
$error = TRUE;
$errorMSG .= "Votre login et votre mot de passe ne doit pas dépasser <strong>60 caractères</strong> !<br>";
$pass = NULL;
}
// Vérification de l'adresse e-mail
$atom = '[-a-z0-9!#$%&\'*+\\/=?^_'{|}~]'; // caractères autorisés avant l'arobase
$domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // caractères autorisés après l'arobase (nom de domaine)
$regex = '/^' . $atom . '+' . // Une ou plusieurs fois les caractères autorisés avant l'arobase
'(\.' . $atom . '+)*' . // Suivis par zéro point ou plus
// séparés par des caractères autorisés avant l'arobase
'@' . // Suivis d'un arobase
'(' . $domain . '{1,63}\.)+' . // Suivis par 1 à 63 caractères autorisés pour le nom de domaine
// séparés par des points
$domain . '{2,63}$/i'; // Suivi de 2 à 63 caractères autorisés pour le nom de domaine
// test de l'adresse e-mail
if (!preg_match($regex, $mail)) {
$error = true;
$errorMSG .= "L'adresse e-mail $email n'est pas valide<br>";
}
//--------------------------------------------------------------------
// Mise-à-jour
//--------------------------------------------------------------------
if($error!=true){
// Si tout se passe correctement, on peut maintenant l'inscrire dans la base de données :
$sql = "INSERT INTO users (login,pass,mail,dateinscription) VALUES ('".$login."','".$pass."','".$mail."',now())";
$sql = mysql_query($sql);
// Si la requête s'est bien effectué :
if($sql==null){
$error = TRUE;
$errorMSG .= "Erreur dans la requête SQL<br/>".$sql."<br/>";
}
}
if($error!=true){
// On met la variable $registerOK à TRUE pour que l'inscription soit finalisée
$registerOK = TRUE;
// On affiche un message pour le dire que l'inscription s'est bien déroulée :
$registerMSG = "Inscription réussie ! Vous êtes maintenant membre du site,<br /> Consultez votre boite email pour vaidation.";
// On le met des variables de session pour stocker le nom de compte et le mot de passe :
$_SESSION["login"] = $login;
$_SESSION["pass"] = $pass;
// Comme un utilisateur est différent, on crée des variables de sessions pour "varier" l'utilisateur comme ceci :
// echo $_SESSION["login"]; (bien entendu avec les balises PHP, sinon cela ne marchera pas
}
}
?>
<?php
mysql_close($BDD);
?>
<?php // On affiche les erreurs :
if($error == TRUE){ echo "<p align='center' style='color:red;'>".$errorMSG."</p>"; }
?>
<?php // Si l'inscription s'est bien déroulée on affiche le succès :
if($registerOK == TRUE){
echo "<p align='center' style='color:green;'><strong>".$registerMSG."</strong></p>";
sendEmail( $login, $pass, $mail );
}
function sendEmail( $login, $pass, $mail ){
$subject = 'xxxxxxxxxxxxxxxx';
$message = 'Bonjour'."\n";
$message .= ''."\n";
$message .= 'Bienvenue sur le site.'."\n";
$message .= 'Vous êtes inscrit avec le pseudo : '.$login.', et le mot de passe : '.$pass."\n";
$message .= 'Vous pouvez à présent vous connecter à cette adresse :(1)'."\n";
$message .= 'http://www.xxxxxxxxxx'."\n";
$message .= ''."\n";
$message .= 'Ce site vous propose :'."\n";
$message .= '- De nombreux tutos pour vous familiariser ou vous perfectionner dans l\'utilisation du logiciel,'."\n";
$message .= '- Un large choix de sprites, classés par catégories.'."\n";
$message .= ''."\n";
$message .= 'Vous avez également la possibilité de poser vos questions sur le forum E-anim'."\n";
$message .= 'http://xxxxxxxxx/'."\n";
$message .= ''."\n";
$message .= 'Cordialement'."\n";
$message .= ''."\n";
$message .= '(1)après une semaine sans validation, le compte sera supprimé'."\n";
$headers ='From: "xxxxxxx"<xxxxxxxxxxx.fr>'."\n"
.'Reply-To: xxxxxxxxxx.fr'."\n"
.'Content-Type: text/plain; charset="iso-8859-1"'."\n"
.'Content-Transfer-Encoding: 8bit';
$result = mail($mail, $subject, $message, $headers);
return $result;
}
?>
<html>
<head>
<title>Inscription</title>
</head>
<body>
<h1>Formulaire d'inscription</h1>
<form action="inscription.php" method="post">
<table>
<tr>
<td><label for="login"><strong>Nom de compte :</strong></label></td>
<td><input type="text" name="login" id="login"/></td>
</tr>
<tr>
<td><label for="pass"><strong>Mot de passe (pas de chiffres) :</strong></label></td>
<td><input type="password" name="pass" id="pass"/></td>
</tr>
<tr>
<td><label for="pass2"><strong>Confirmez le mot de passe :</strong></label></td>
<td><input type="password" name="pass2" id="pass2"/></td>
</tr>
<tr>
<td><label for="login"><strong>Adresse mail:</strong></label></td>
<td><input type="text" name="mail" id="mail"/></td>
</tr>
</table>
<input type="submit" name="register" value="S'inscrire"/>
</form>
</body>
</html>
/spoiler
J'ai mis du md5 parcequ'il s'agit de la refonte en "cousu main" d'un site qui avait été fait avec Drupal, et je récupèrerai certains champs de la table des users dans laquelle les pass sont manifestement en md5, et je voudrais assurer la compatibilité.
La nouvelle BDD est opérationnelle et je ferai le remplacement des users au dernier moment.
Apparemment les spoilers en BBcode ne marchent pas ici
Merci de votre écoute
[spoiler]
<?php
session_start();
$BDD = mysql_connect("xxxxxxxx","xxxxxxt","xxxxxxxx");
mysql_select_db("xxxxxxxxxxxxxt");
?>
<?php
// On met les variables utilisées dans le code PHP à FALSE (C'est-à-dire les désactiver pour le moment).
$error = FALSE;
$registerOK = FALSE;
$errorMSG = '';
// On regarde si l'utilisateur est bien passé par le module d'inscription
if(isset($_POST["register"])){
//--------------------------------------------------------------------
//Sécurisation
//--------------------------------------------------------------------
$login = htmlspecialchars(trim($_POST['login']));
$pass = md5(mysql_real_escape_string(htmlspecialchars(trim($_POST['pass']))));
$pass2 = md5(mysql_real_escape_string(htmlspecialchars(trim($_POST['pass2']))));
$mail = htmlspecialchars(trim($_POST['mail']));
//--------------------------------------------------------------------
// Vérifications
//--------------------------------------------------------------------
// On regarde si tous les champs sont remplis, sinon, on affiche un message à l'utilisateur.
if($login == NULL OR $pass == NULL OR $pass2 == NULL OR $mail == NULL){
// On met la variable $error à TRUE pour que par la suite le navigateur sache qu'il y'a une erreur à afficher.
$error = TRUE;
// On écrit le message à afficher :
$errorMSG .= "Tous les champs doivent être remplis !<br>";
}
// Sinon, si les deux mots de passe correspondent :
if($pass != $pass2){
$error = TRUE;
$errorMSG .= "Les deux mots de passe sont différents !<br>";
$pass = NULL;
}
// On regarde si le mot de passe et le nom de compte ne sont pas les mêmes
if($login == $pass){
$error = TRUE;
$errorMSG .= "Le nom de compte et le mot de passe doivent être différents !<br>";
}
// Si c'est bon on regarde dans la base de données si le nom de compte est déjà utilisé :
$sql = "SELECT login FROM users WHERE login = '".$login."' ";
$sql = mysql_query($sql);
// On compte combien de valeur à pour nom de compte celui tapé par l'utilisateur.
$sql = ($sql!==null && $sql!="")? mysql_num_rows($sql):0;
if($sql != 0){
$error = TRUE;
$errorMSG .= "Le pseudo <strong>".$login."</strong> est déjà utilisé !<br>";
$login = NULL;
}
// Si tout va bien on regarde si le mot de passe n'excède pas 60 caractères.
if(strlen($pass >= 32) || strlen($login >= 60)){
$error = TRUE;
$errorMSG .= "Votre login et votre mot de passe ne doit pas dépasser <strong>60 caractères</strong> !<br>";
$pass = NULL;
}
// Vérification de l'adresse e-mail
$atom = '[-a-z0-9!#$%&\'*+\\/=?^_'{|}~]'; // caractères autorisés avant l'arobase
$domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // caractères autorisés après l'arobase (nom de domaine)
$regex = '/^' . $atom . '+' . // Une ou plusieurs fois les caractères autorisés avant l'arobase
'(\.' . $atom . '+)*' . // Suivis par zéro point ou plus
// séparés par des caractères autorisés avant l'arobase
'@' . // Suivis d'un arobase
'(' . $domain . '{1,63}\.)+' . // Suivis par 1 à 63 caractères autorisés pour le nom de domaine
// séparés par des points
$domain . '{2,63}$/i'; // Suivi de 2 à 63 caractères autorisés pour le nom de domaine
// test de l'adresse e-mail
if (!preg_match($regex, $mail)) {
$error = true;
$errorMSG .= "L'adresse e-mail $email n'est pas valide<br>";
}
//--------------------------------------------------------------------
// Mise-à-jour
//--------------------------------------------------------------------
if($error!=true){
// Si tout se passe correctement, on peut maintenant l'inscrire dans la base de données :
$sql = "INSERT INTO users (login,pass,mail,dateinscription) VALUES ('".$login."','".$pass."','".$mail."',now())";
$sql = mysql_query($sql);
// Si la requête s'est bien effectué :
if($sql==null){
$error = TRUE;
$errorMSG .= "Erreur dans la requête SQL<br/>".$sql."<br/>";
}
}
if($error!=true){
// On met la variable $registerOK à TRUE pour que l'inscription soit finalisée
$registerOK = TRUE;
// On affiche un message pour le dire que l'inscription s'est bien déroulée :
$registerMSG = "Inscription réussie ! Vous êtes maintenant membre du site,<br /> Consultez votre boite email pour vaidation.";
// On le met des variables de session pour stocker le nom de compte et le mot de passe :
$_SESSION["login"] = $login;
$_SESSION["pass"] = $pass;
// Comme un utilisateur est différent, on crée des variables de sessions pour "varier" l'utilisateur comme ceci :
// echo $_SESSION["login"]; (bien entendu avec les balises PHP, sinon cela ne marchera pas
}
}
?>
<?php
mysql_close($BDD);
?>
<?php // On affiche les erreurs :
if($error == TRUE){ echo "<p align='center' style='color:red;'>".$errorMSG."</p>"; }
?>
<?php // Si l'inscription s'est bien déroulée on affiche le succès :
if($registerOK == TRUE){
echo "<p align='center' style='color:green;'><strong>".$registerMSG."</strong></p>";
sendEmail( $login, $pass, $mail );
}
function sendEmail( $login, $pass, $mail ){
$subject = 'xxxxxxxxxxxxxxxx';
$message = 'Bonjour'."\n";
$message .= ''."\n";
$message .= 'Bienvenue sur le site.'."\n";
$message .= 'Vous êtes inscrit avec le pseudo : '.$login.', et le mot de passe : '.$pass."\n";
$message .= 'Vous pouvez à présent vous connecter à cette adresse :(1)'."\n";
$message .= 'http://www.xxxxxxxxxx'."\n";
$message .= ''."\n";
$message .= 'Ce site vous propose :'."\n";
$message .= '- De nombreux tutos pour vous familiariser ou vous perfectionner dans l\'utilisation du logiciel,'."\n";
$message .= '- Un large choix de sprites, classés par catégories.'."\n";
$message .= ''."\n";
$message .= 'Vous avez également la possibilité de poser vos questions sur le forum E-anim'."\n";
$message .= 'http://xxxxxxxxx/'."\n";
$message .= ''."\n";
$message .= 'Cordialement'."\n";
$message .= ''."\n";
$message .= '(1)après une semaine sans validation, le compte sera supprimé'."\n";
$headers ='From: "xxxxxxx"<xxxxxxxxxxx.fr>'."\n"
.'Reply-To: xxxxxxxxxx.fr'."\n"
.'Content-Type: text/plain; charset="iso-8859-1"'."\n"
.'Content-Transfer-Encoding: 8bit';
$result = mail($mail, $subject, $message, $headers);
return $result;
}
?>
<html>
<head>
<title>Inscription</title>
</head>
<body>
<h1>Formulaire d'inscription</h1>
<form action="inscription.php" method="post">
<table>
<tr>
<td><label for="login"><strong>Nom de compte :</strong></label></td>
<td><input type="text" name="login" id="login"/></td>
</tr>
<tr>
<td><label for="pass"><strong>Mot de passe (pas de chiffres) :</strong></label></td>
<td><input type="password" name="pass" id="pass"/></td>
</tr>
<tr>
<td><label for="pass2"><strong>Confirmez le mot de passe :</strong></label></td>
<td><input type="password" name="pass2" id="pass2"/></td>
</tr>
<tr>
<td><label for="login"><strong>Adresse mail:</strong></label></td>
<td><input type="text" name="mail" id="mail"/></td>
</tr>
</table>
<input type="submit" name="register" value="S'inscrire"/>
</form>
</body>
</html>
/spoiler
J'ai mis du md5 parcequ'il s'agit de la refonte en "cousu main" d'un site qui avait été fait avec Drupal, et je récupèrerai certains champs de la table des users dans laquelle les pass sont manifestement en md5, et je voudrais assurer la compatibilité.
La nouvelle BDD est opérationnelle et je ferai le remplacement des users au dernier moment.
Apparemment les spoilers en BBcode ne marchent pas ici
Merci de votre écoute
le bbcode doit être interprété en php pour en faire du html
mysql_real_escape_string et html_special_char sont inutiles si la variable est hashé vu que le hash rendra impossible les injections
utiliser pdo plutot que les fonctions mysql en faisant des requêtes préparer permet d'optimiser sont code et de ne plus se soucier des injections SQL vu que les valeurs sont passé en paramètre et non inclu dans une chaine
voilà un exemple d'utilisation de pdo
mysql_real_escape_string et html_special_char sont inutiles si la variable est hashé vu que le hash rendra impossible les injections
utiliser pdo plutot que les fonctions mysql en faisant des requêtes préparer permet d'optimiser sont code et de ne plus se soucier des injections SQL vu que les valeurs sont passé en paramètre et non inclu dans une chaine
$p = new PDO();
$req = $p->prepare('SELECT * FROM table WHERE id = :idduntruc LIMIT 1);
$req->execute(array('idduntruc' => 12));
$data = $req->fetch(PDO::FETCH_OBJ);
$req->closeCursor();
voilà un exemple d'utilisation de pdo