Hoi Allemaal,

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!
Niet het wachtwoord opsturen, maar een nieuw wachtwoord maken (random) en dat samen met een bevestigingscode opsturen naar de gebruiker. Die zal dan feitelijk hetzelfde proces doormoeten als bij het aanmelden.
Wat dacht je van een nieuw wachtwoord sturen ;-)?

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.
@ Aar,

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?
Wat Aar zegt is hetzelfde als wat ik zeg, hij zegt het alleen iets anders.
De bevestigingscode heb je overigens niet nodig, dat is meer voor het aanpassen van emailaddressen, niet voor passwords. Mijn fout.
Oke bedankt voor de reacties. Ik ga er wel uit komen zo denk.

Thanks!

[size=xsmall]Toevoeging op 14/06/2012 15:56:08:[/size]

Oke het is me gelukt met jullie advies!

Hieronder de code :
Functie om een random string te maken :
<?php
function ranpass($len = 8){
$pass = NULL;
for($i=0; $i<$len; $i++) {
$char = chr(rand(48,122));
while (!ereg("[a-zA-Z0-9]", $char)){
if($char == $lchar) continue;
$char = chr(rand(48,90));
}
$pass .= $char;
$lchar = $char;
}
return $pass;
}

?>

En het updaten/mailen van het wachtwoord:

<?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();

} ?>

[size=xsmall]Toevoeging op 14/06/2012 16:04:55:[/size]

Ik hoop overigens wel dat het veilig is zo, ben namelijk nog maar een PHP beginner.
Dit is echter wel fout. Je gebruikt variabelen in quotes in je query.
Kijk naar regel 5.
dat moet niet dit zijn

$check = mysql_query("SELECT * FROM users WHERE voornaam = '$voornaam' AND emailadres = '$emailadres'");

Maar dit:
$check = mysql_query("SELECT * FROM users WHERE voornaam = '".$voornaam."' AND emailadres = '".$emailadres."'");
Wat is het verschil? Het werkt toch precies hetzelfde?
ereg: This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged

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.
Oke dat gaat me dus al weer een tikje te ver:p
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.

Reageren