Wachtwoord vergeten functie maken
Ben nog bezig met mijn artikel scriptje. Alles werkt opzich naar behoren, alleen wil ik er nu nog een functie bij maken waarin je je wachtwoord kan veranderen. De wachtwoorden van gebruikers staan opgeslagen als SHA1, dus direct het wachtwoord mailen gaat niet. Ik heb al gezocht naar tutorials, maar kom alleen tutorials tegen waar de wachtwoorden niet gehasjd zijn. Heeft iemand voor mij een goeie tutorial hier voor of kan iemand mij de stappen uitleggen die ik moet doorlopen? Denk dat ik er dan aardig uit moet komen.
Alvast bedankt!
Gewijzigd op 14/06/2012 14:40:33 door Erwin H
Als je de werkelijke waarde van SHA1 zou kunnen terughalen zou heel SHA1 onnodig zijn geweest ;-). Dus gelukkig maar dat SHA1 one-way encryption is.
Emailadres is bij mij gelijk de username, dus ik neem aan dat ik dan ook nog iets moet checken of bijv voornaam overeenkomt met het emailadres, en zoja een nieuw wachtwoord sturen, of zit ik er naast?
@ Erwin,
De manier van Aar lijkt me simpeler, maar zit hier nog veel verschil in qua veiligheid?
De bevestigingscode heb je overigens niet nodig, dat is meer voor het aanpassen van emailaddressen, niet voor passwords. Mijn fout.
Thanks!
Toevoeging op 14/06/2012 15:56:08:
Oke het is me gelukt met jullie advies!
Hieronder de code :
Functie om een random string te maken :
Code (php)
En het updaten/mailen van het wachtwoord:
Code (php)
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
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
<?php if ( 'POST' == $_SERVER['REQUEST_METHOD'] )
{
$voornaam = mysql_real_escape_string($_POST['voornaam']);
$emailadres = mysql_real_escape_string($_POST['emailadres']);
$check = mysql_query("SELECT * FROM users WHERE voornaam = '$voornaam' AND emailadres = '$emailadres'");
if (mysql_num_rows($check) == 1)
{
// Gebruiker bestaat, wachtwoord aanmaken en mailen
$newpass = ranpass(); // Wachtwoord aanmaken
$insertpass = sha1($newpass);
mysql_query("UPDATE users SET wachtwoord = '$insertpass' WHERE emailadres = '$emailadres'");
echo "<p>We hebben een nieuw wachtwoord voor je ingesteld. Deze is per email naar je verzonden.</p>";
$mssg = "We hebben een nieuw wachtwoord voor je ingesteld.\n Wachtwoord : $newpass \n\n Met vriendelijke groeten, \n $sitenaam \n $siteurl";
mail($emailadres, "Nieuw wachtwoord", $mssg, "From: $sitenaam<$sitemail>");
}
else
{
echo "<p>Voornaam/Emailadres combinatie komt niet overeen. We konden je daarom geen nieuw wachtwoord sturen.</p>";
ShowWachtwoordForm();
}
}
else
{
ShowWachtwoordForm();
} ?>
{
$voornaam = mysql_real_escape_string($_POST['voornaam']);
$emailadres = mysql_real_escape_string($_POST['emailadres']);
$check = mysql_query("SELECT * FROM users WHERE voornaam = '$voornaam' AND emailadres = '$emailadres'");
if (mysql_num_rows($check) == 1)
{
// Gebruiker bestaat, wachtwoord aanmaken en mailen
$newpass = ranpass(); // Wachtwoord aanmaken
$insertpass = sha1($newpass);
mysql_query("UPDATE users SET wachtwoord = '$insertpass' WHERE emailadres = '$emailadres'");
echo "<p>We hebben een nieuw wachtwoord voor je ingesteld. Deze is per email naar je verzonden.</p>";
$mssg = "We hebben een nieuw wachtwoord voor je ingesteld.\n Wachtwoord : $newpass \n\n Met vriendelijke groeten, \n $sitenaam \n $siteurl";
mail($emailadres, "Nieuw wachtwoord", $mssg, "From: $sitenaam<$sitemail>");
}
else
{
echo "<p>Voornaam/Emailadres combinatie komt niet overeen. We konden je daarom geen nieuw wachtwoord sturen.</p>";
ShowWachtwoordForm();
}
}
else
{
ShowWachtwoordForm();
} ?>
Toevoeging op 14/06/2012 16:04:55:
Ik hoop overigens wel dat het veilig is zo, ben namelijk nog maar een PHP beginner.
Kijk naar regel 5.
dat moet niet dit zijn
Code (php)
1
$check = mysql_query("SELECT * FROM users WHERE voornaam = '$voornaam' AND emailadres = '$emailadres'");
Maar dit:
Wat is het verschil? Het werkt toch precies hetzelfde?
Waarom variabelen kopiëren?
Bewerking/beveiliging in query.
Foutafhandeling van je query mist.
php --> (echo) ' en in html " gebruiken.
mail; geen foutafhandeling. Headers missen. Gebruik liever phpmailer of swiftmailer
voor beveiliging niet alleen vertrouwen op sha1, maar liever salt (+ pepper) toevoegen.
Variabelen kopieren doe ik omdat ik dit voor mijzelf wat fijner vind werken, maar als dit not-done is zal ik het weghalen.
De query word alleen uitgevoerd als daadwerkelijk het emailadres en naam overeenkomt, hier kan dan toch weinig fout aan gaan, toch?
php --> (echo) ' en in html " gebruiken. , wat bedoel je hier precies mee?
Over phpmailer, ga ik even onderzoeken, evenals de salt en pepper.
Je moet de mysql_query in een variabele zetten en kijken of hij geen false terug geeft, als hij dus geen false terug geeft is de query gelukt. als de query wel false terug geeft kun je een foutmelding echo'en. Dit is een simpele maar goede manier van fout afhandelen.
Patrick vd Pols op 14/06/2012 16:48:11:
Variabelen kopieren doe ik omdat ik dit voor mijzelf wat fijner vind werken, maar als dit not-done is zal ik het weghalen.
Het is meer uit praktisch oogpunt. Omdat jij een variabele kopieert (en bewerkt) zul jij later in het script niet meer weten of het nu gaat om input vanuit bv een form of dat het gaat om bv een variabele die voortkomt uit bv een select-query.
Patrick vd Pols op 14/06/2012 16:48:11:
De query word alleen uitgevoerd als daadwerkelijk het emailadres en naam overeenkomt, hier kan dan toch weinig fout aan gaan, toch?
Je query wordt altijd uitgevoerd; de controle vindt plaats in de query.
[/quote]
Patrick vd Pols op 14/06/2012 16:48:11:
php --> (echo) ' en in html " gebruiken. , wat bedoel je hier precies mee?
HTML gebruikt " bv <a href="link_naar_pagina.html">
Bij php is het, daarom, vaak handiger om in echo ' te gebruiken.
t.a.v. variabelen buiten quotes: http://www.pfz.nl/wiki/variabelen-buiten-quotes/