Envoi de mot de passe par email
J'ai un problème avec ce code:
[code]
[/code]
(script qui envoi le password d'un membre dans sa boite mail)
Le problème, c'est que lors de son execution ça me met "Access denied for user 'xxxx'@'localhost' (using password: NO" .
Cela veut dire que j'ai voulu essayer de me connecter sans mdp. Or je l'ai bien fait pourtant (voir: "zzzz") . Je ne comprend pas l'erreur.
PS: les xxxx, zzzz, le nom de la BDD et sqdqsd@qfdqsfq.kk sont à remplacer biensur :)
Réponses apportées à cette discussion
<form action="" name="send" method="post"><input type="text" name="courriel" value="" /><input type="submit" name="envoi" value="Remplacer" /></form> <?php //début code phpif (isset($_POST['courriel'])){$connec = mysql_connect("localhost", "xxxx", "zzzzzz" );mysql_select_db("ghgkldfs_acces" );// test des variables $_SESSION['recuperation']['erreur'] = 'Tous les champs sont obligatoires'; header('Location:signup.php'); // redirection vers le formulaire} else { $courriel = htmlentities(addslashes( $_POST['courriel']));$query = "SELECT * FROM users WHERE user_email='$courriel'";$resultat = mysql_query($query)or die("L'interrogation a echouée car ". mysql_error() ."." );mysql_close($connec);$message='Cher membre,Suite à votre demande voici vos identifiants de connexion à votre compteLogin de connexion : '.$pseudo.'Mot de passe : '.$motdepasse.' PS: N\'hésitez pas à faire un tour sur le forum ou sur le chat ;)';//on envoie le mailmail($courriel, 'qfdqsfq.kk. Votre mot de passe', $message, "From:sqdqsd@qfdqsfq.kk" );header('Location:');}?>
Gros malin, regarde ton code de plus près et tente de ralentir le rythme de tes pensées en suivant pas à pas ce qui se passe pendant le déroulement des opérations ;-)
Tu vas réaliser que tu ne fais pas la connexion au bon endroit. Donc la connexion qui est effectuée est automatique mais retourne une erreur parce qu'il n'y a pas les bons paramètres.
Je ne te donne pas la réponse pour l'isntant, je te laisse la trouver, c'est trop gros pour que tu le manques.
:D
Un conseil : indente bien ton code, tu te faciliteras la lecture etdu coup auras également moins de risques de faire ce genre de faute d'inattention :
<form action="" id="send" method="post">
<input type="text" name="courriel" value="" />
<input type="submit" name="envoi" value="Remplacer" />
</form>
<?php //début code php
if (isset($_POST['courriel']))
{
$connec = mysql_connect("localhost", "xxxx", "zzzzzz" );
mysql_select_db("ghgkldfs_acces" );
// test des variables
$_SESSION['recuperation']['erreur'] = 'Tous les champs sont obligatoires';
header('Location:signup.php'); // redirection vers le formulaire
}
else
{
$courriel = htmlentities(addslashes( $_POST['courriel']));
$query = "SELECT * FROM users WHERE user_email='". $courriel ."'";
$resultat = mysql_query($query) or die("L'interrogation a echouée car ". mysql_error() ."." );
mysql_close($connec);
$message = 'Cher membre,
Suite à votre demande voici vos identifiants de connexion à votre compte
Login de connexion : '. $pseudo .'
Mot de passe : '. $motdepasse.'
PS: N\'hésitez pas à faire un tour sur le forum ou sur le chat ;)';
//on envoie le mail
mail($courriel, 'qfdqsfq.kk. Votre mot de passe', $message, "From:sqdqsd@qfdqsfq.kk" );
header('Location:');
}
?>
trouvé ! (il fallait mettre le mysql connect avant le if ) mais maintenant j'ai une autre erreur: "Warning: Cannot modify header information - headers already sent by (output started at /home/xxxx/public_html/forgot2.php:6) in /home/xxx/public_html/forgot2.php on line 27 " Donc ce que j'ai fait, c'est que j'ai supprimé ces 2 "header" du code. Et là... Tout fonctionne ! Ou presque... : Pas d'erreur , mais aucun mail reçu. Je ne comprend pas...
C'est presque ça : la connexion à MySQL était effectivement mal placée, mais au départ, la logique était de n'effectuer la connexion que si elle était nécessaire.En la déplaçant avant le « if », il y aura connexion systématique. As-tu songé à la mettre dans le « else » ? dans ce cas, il n'y a connexion que si le formulaire est validé et que ça devient nécessaire.
Pour le problème de header, tu dois avoir un conflit avec un session_start quelque part : on ne peut rien envoyer au navigateur avant de lancer une session : si tu as ce message, c'est que des erreurs sont rencontrées avant le session_start et affichent donc des erreurs. Lorsque ce type de problème survient, c'est que le lancement de la session est mal placé dans le déroulement de ton code.
Problème réglé ! Voir:
Merci pour ton aide
Pas de quoi.
Mais attention quand même : j'ai regardé un peu le tuto, j'y ai relevé divers problèmes dont un majeur.
À partir du code suivant montré dans le tuto :
$email_to = $_POST['email_to'];
$tbl_name=members;
$sql="SELECT password FROM $tbl_name WHERE email='$email_to'";
Il y a une erreur à la ligne 2 : « members » devrait être entre guillemets, là tu vas avoir une erreur de constante indéfinie.
La faute majeure, c'est que ce code est ouvert à un piratage par injection SQL. Ce code ne montre nulle part de validation des données envoyées, donc si dans le champ « email_to » j'écris ceci : « ' OR name ='admin », ça va donner au final la requête suivante :
SELECT password FROM members WHERE email='' OR name ='admin'
Je te laisse deviner les conséquences possibles.
Mince, alors comment je peux faire ? (désolé du temps de réponse, j'étais occupé)
Parceque je vois pas en quoi un mail de confirmation permettrait d'empecher cela...
Tu peux dans un premier temps valider les données reçues, par exemple vérifier que l'adresse de courriel est conforme. Ensuite, tu peux les protéger avec la fonction mysql_real_escape() qui va transformer les apostrophes en « \' » : en faisant ça, la requête que j'ai illustrée précédemment deviendrait :
SELECT password FROM members WHERE email='\' OR name =\'admin'
Dans ce cas, la requête ne retournera aucun résultat : partant de là, tu peux renvoyer un message d'erreur au lieu du mot de passe.
Ok, je prend en compte ce que tu dis.
Garde toujours à l'esprit un principe fondamental : on ne peut jamais accorder une confiance pleine et entière aux données reçue d'un utilisateur. La validation est dont systématiquement obligatoire et ne doit en aucun cas être négligée.
Si tu le souhaites, mets ici le code que tu envisages de mettre en fin de compte quand il sera prêt et il se trouvera toujours quelqu'un pour te donner un commentaire sur sa validité :)
Je suis entrain de regarder ça:
ça me semble vraiment pas mal: tout fonctionne, je reçoit bien un nouveau mot de passe (encore mieux que ce que je voulais) . Avec ajout en MD5 dans la BDD . Bref, je crois que j'ai trouvé ce que je cherchais .
C'est bourré de fautes, mais je me suis arrangé pour les enlevé .
Donc problème (je pense) définitivement réglé ! Cependant, merci pour ton aide.
Pas de quoi :)
Pour les fautes, n'hésite jamais à prendre le temps nécessaire à leurs corrections, tu en retireras un bénéfice non négligeable à long terme. Mon tout premier script en PHP, c'était un forum. Il relativement complet quoique très basique, on est très loin d'un PHPBB, mais même j'ai écrit ça en 2003, depuis 4 ou 5 ans, je n'y ai pas apporté la moindre correction et il fonctionne toujours malgré les changement de versions de PHP sur le serveur. À l'époque, je n'étais qu'un amateur, apprenant le PHP comme toi aujourd'hui. Paradoxalement, je suis aujourd'hui un professionnel et je gagne ma vie avec le PHP, mais je dois passer un temps considérable à corriger des erreurs laissées par des prédecesseurs laxistes. Rigueur et discipline sont les règles indispensables si tu veux construire des applications solides et durables ;)
Merci du conseil !
Really very nice Good article! Thank you so much for sharing this post. discount ugg boots