Wat vinden jullie de beste manier om een bezoeker van je site een nieuw wachtwoord te geven?

Moeten ze de gebruikersnaam en het email adres precies goed invullen, of kiezen tussen gebruikersnaam en email adres? Of iets anders? Een geheime vraag en antwoord?

Voor het idee had ik al een soort pseudo-code of zoiets gemaakt:


<?php
    //wachtwoordvergeten.php
    if (niet op post geklikt)
    {   
        ?> 
        <!-- formulier -->
        <?php
    }
    else
    {
        //haal emailadres op van gebruiker
        //zet random-code in een variabele: $random
        //zet $random in een veld in de DB (bij betreffende user)
        //stuur email met $random naar betreff user
        //niks 
    }
    
    
    //wachtwoordvergetencontrole.php
    if (!empty($_GET['code']))
    {
        //selecteer email van user waar code is $_GET['code']
        //stuur email naar user met nieuwe random code
        //zet md5(die random code) in de database als wachtwoord
        //user heeft nu nieuw wachtwoord
    }
    else
    {
        echo 'geen code ontvangen. klik <a>hier</a> om code op te laten sturen';
    }
?>
Via emailadres is het makkelijkst. Je kan namelijk ook best je gebruikersnaam zijn vergeten. Ga er vanuit dat je je emailadres niet zal vergeten.
Klopt, je hebt gelijk.

En als je alleen je username weet?
Gebruikersnaam en emailadres. Dan een link sturen naar het emailadres waar men een nieuw password kan opgeven.
En als je dan je gebruikersnaam bent vergeten, zoals Michiel Haverlag al zegt? En als je geen nieuwe user kan maken omdat dat e-mail adres al een user heeft?
Heb zelf dit:

<?
include("../config.php");
?>
<head>
<link href="../css.css" rel="stylesheet" type="text/css" />
<script language="javascript" type="text/javascript"
src="script.js"></script>
</head>
<body bgcolor="#052645" alink="#FFFFFF" vlink="#FFFFFF" link="#FFFFFF"> 
<table width="95%" cellpadding="0" cellspacing="0" align="center">
	<tr scope="col"><td background="../images/kopbar.gif" class="tekst" align="center">Wachtwoord vergeten</td></tr>
	<td bgcolor="#006BD8" class="tekst" align="center">
	<?php
	if(isset($_GET['vergeten'])){
	$naam = str_replace(' ','',$_POST['name']);
	$ww = str_replace(' ','',$_POST['ww1']);
	$ww1 = str_replace(' ','',$_POST['ww2']);
	$email = str_replace(' ','',$_POST['email']);
	$vraag = $_POST['vraag'];
	$antwoord = $_POST['antwoord'];
	$code = $_POST['code'];
	$check = $_POST['code1'];
	$error = '';
	$total_pass = md5($ww);
	$gev = mysql_query("SELECT * FROM leden WHERE naam = '".$naam."'");
	$true = mysql_num_rows($gev);
	if($true!=1){echo "U heeft een verkeerde username opgegeven"; exit();}
	$gegevens = mysql_fetch_object($gev);
	$actief = $gegevens->actief;
	$vraagcheck = $gegevens->vraag;
	$antwoordcheck = $gegevens->antwoord;
	$emailcheck = $gegevens->email;
	if($code!=$check){$error.="U heeft de code onjuist overgenomen!</br>";}
	if($ww!=$ww1){$error.= "U heeft niet 2 dezelfde wachtwoorden opgegeven!</br>";}
	if($email!=$emailcheck){$error.= "Dit emailadres hoort niet bij dit account!</br>";}
	if($vraag!=$vraagcheck){$error.= "U heeft niet de vraag gekozen die u bij het registreren gekozen heeft</br>";}
	if($antwoord!=$antwoordcheck){$error.= "U heeft niet het antwoord gekozen die u koos bij het registreren!</br>";}
	if($actief==0){$error.= "Uw account is nog niet actief!</br>";}
	if(empty($error)){
	echo "Uw wachtwoord is succesvol gewijzigd!";
	mysql_query("UPDATE leden SET ww = '".$total_pass."' WHERE naam = '".$naam."'"); 
	}else{
	echo $error;
	}
	}else{
	$code = rand(1000,9999);
	echo "<form action='passwordvergeten.php?vergeten=1'method='post'>
	Gebruikersnaam:<br>
	<input type='text' name='name'><br>
	Gewenst wachtwoord:<br>
	<input type='password' name = 'ww1'><br>
	Wachtwoord controle:<br>
	<input type='password' name ='ww2'><br>
	Email adres:<br>
	<input type='text' name='email'><br>
	Geheime vraag:<br>
	<select name='vraag'>
	<option value=''></option>
	<option value='1'>Lievelings-eten</option>
	<option value='2'>Naam vriendin</option>
	<option value='3'>Naam broertje</option>
	<option value='4'>Favoriete site</option>
	<option value='5'>Favoriete plek</option>
	</select><br>
	Antwoord:<br>
	<input type='text'name='antwoord'><br>
	Typ de volgende code over</br>in het tekstveld: $code</br><input type='text' name='code1' 				    maxlength=`4`>
	<input type='hidden' value='$code' name='code'></br>
	<input type='submit' name = 'vergeten' value='Recover' class='submit1'>
	</form>";
	}
	?>
	</td>
</table>


Ik kan niet werken met mail server, dus niet mailen

Ik gebruik dus nu geheime vraag
SanThe schreef op 13.11.2006 16:15
Gebruikersnaam en emailadres. Dan een link sturen naar het emailadres waar men een nieuw password kan opgeven.


Als het goed is, heb je maar 1 user per e-mailadres, het opgeven van het e-mail adres zal dan voldoende zijn, omdat alleen de user dan in zijn mail kan komen, om z'n wachtwoord te zien.
In de mail kan je dan bijv het username meesturen.
Robert schreef op 13.11.2006 16:18
[quote='SanThe schreef op 13.11.2006 16:15']Gebruikersnaam en emailadres. Dan een link sturen naar het emailadres waar men een nieuw password kan opgeven.


Als het goed is, heb je maar 1 user per e-mailadres, het opgeven van het e-mail adres zal dan voldoende zijn, omdat alleen de user dan in zijn mail kan komen, om z'n wachtwoord te zien.
In de mail kan je dan bijv het username meesturen.[/quote]
Maar een emailadres is vaak bij anderen ook bekend. Dus om te voorkomen dat 'nare mensen' er mee kunnen rommelen vind ik dat ook de gebruikersnaam moet worden opgegeven. Dus puur ter controle. Weet je die ook niet meer, neem dat contact op met de beheerder.
In ieder geval niet het oude wachtwoord meer geven, maar een nieuw wachtwoord dat door een script wordt aangemaakt of dat je de bezoeker zelf een nieuw wachtwoord laat maken. Verder is een geheime vraag ook verstandig; mocht iemand in een mailbox komen, dan heeft hij alsnog het antwoord op de vraag nodig om een nieuw wachtwoord aan te kunnen vragen.

Je zou ook iets met het ip-adres kunnen doen, of bijvoorbeeld gegevens opslaan over de aanvraag en wijziging van een wachtwoord: vanaf welk adres werd het gedaan, op welke datum en tijd etc. Krijg je dan later vragen over dat een wachtwoord zou zijn gewijzigd door iemand anders, dan kan je hem vragen wanneer hij volgens hem voor het laatst heeft ingelogd en al dan niet besluiten een nieuw wachtwoord in te stellen.
Ik heb:

- Gebruikersnaam opgeven
- Je krijgt een mailtje met een link (met een code erin)
- Op die pagina wordt het nieuwe wachtwoord ingesteld en krijg je het te zien
Ik denk dat ik het als volgt ga doen:

user: email adres opgeven
scrip: email sturen met code
user: naar link gaan .php?code={code-via-email}
scrip: stuur email naar persoon met nieuw wachtwoord

Reageren