Om det er smart eller ej at tillade flere brugere at have den samme mail adresse kan vel diskuteres - dog ser jeg heller ikke umiddelbart nogen sikkerheds ricisi forbundet med det, dog ville jeg nok i det mindste være sikker på at validere brugeren's email når dette gøres (hvilket man jo nok altid bør gøre).
Dog vil jeg mene at hvis du gemmer brugerens kodeord i clear tekst i databasen - så beder man altså om at få en over nallerne. Det gør jo at en eventuelt hacker kun er 1 skridt fra at kunne få kodeord hos ALLE der har en bruger på din hjemmeside - og lad os hurtigt indse dette, chancen for at en god del af disse brugere har samme kodeord til deres e-mail er nok rimelig stor - og derved har denne hacker lige pludselig adgang til uanede mængder af information som bare er guf for ham. Derfor vil jeg foreslå dig at anvende en envejs kryptering på dine kodeord - og derfor bliver du også nødt til at generere et nyt kodeord for brugere når de bruger din glemt kodeords funktion.
Her følger lidt kode som kunne gøre dette, jeg anvender her md5 som kryptering, dog bør du se efter bedre løsninger da denne har en del sikkerheds ricisi alene, desværre kan jeg ikke lige komme på andre.
function authenticateUser($user, $pass){
$md5Pass = md5($pass);
$query = "SELECT COUNT(*) FROM profiler WHERE user = '" . mysql_real_escape_string($user) . "' AND password = '" . mysql_real_escape_string($pass) . "'";
$res = mysql_query($query) or die(mysql_error()); // fjern or die... ved produktion, brug kun til test
return mysql_num_rows($res) > 0;
}
Ovenstående kode viser hvordan du relativt simpelt kan chekke om en bruger har indtastet korrekt login. Bemærk brugen af mysql_real_escape_string på bruger input som sikrer mod sql injection, alternativ og bedre måde ville være gennem brug af prepared statements som du kan læse mere om på php.net under mysqli sektionen.
Den ideelle måde at lave en glemt kodeords funktion er herefter først at man indtaster sin e-mail, herefter generes så et unikt id som indsættes i profiler tabellen ud for den enkelte bruger, og du udsender herefter en e-mail til brugeren med et link som han skal klikke for at få det nye kodeord. Går brugeren så ind på dette link så validerer du selvfølgelig ud fra det unikke ID, passer id'et jamen så generer du et nyt kodeord og sender det IGEN per e-mail til brugeren og selvfølgelig opdaterer du nu tabellen til at virke med dette.
function requestNewCode($email){
$query = "SELECT * FROM profiler WHERE LOWER(email) = '" . mysql_real_escape_string(strtolower($email)) . "'"; //Er ikke 100% sikker på om mysql funktionen for at konvertere til lowercase hedder LOWER, check op imod mysql manualen på mysql.com
$res = mysql_query($query) or die(mysql_error()); //Igen fjern når koden er gennemtestet og virker og du kører siden live
if(mysql_num_rows($res) < 1){
return false; //Ingen brugere med den angivne email
}
while($row = mysql_fetch_assoc($res)){
$email = $row['email'];
$navn = $row['navn'];
$randomId = md5(time()); //Bør nok finde en bedre algorytme her til at generee tilfældigt id med
mail($email, "Forespørgsel om nyt kodeord", "Hej $navn,\n\nDu har forespurgt om et nyt kodeord, for at få dette skal du dog først lige bekræfte at det er dig der har efterspurgt det nye kodeord, følg venligst følgende link: http://xxxxxx.tld/newpassword.php?email=" . urlencode($email) ."&id=" . $randomId . "\n\nHvis du ikke har efterspurgt om et nyt kodeord, ignorer da venligst denne mail");
//Gem det tilfældige kodeord til senere validering
$query = "UPDATE profiler SET newpasswordid = '" . mysql_real_escape_string($randomId) . "'";
mysql_query($query) or die(mysql_error()); /igen slet når skidtet kører og virker
}
return true;
}
Til sidst har du så funktionen til rent faktisk at udskifte kodeordet
function validateNewPasswordRequest($email, $id){
$query = "SELECT COUNT(*) FROM profiler where LOWER(email) = '" . mysql_real_escape_string($email) . "' AND newpasswordid = '" . mysql_real_escape_string($id) . "' AND newpasswordid <> ''"; //Checker for at der er sat et nyt kodeords id også!
$res = mysql_query($query) or die(mysql_error()); //Igen fjer når det hele virker
if(mysql_num_rows($query) != 1){
return false; //Forkert email/id kombination
}
$newPassword = md5(time()); //Igen find en bedre måde at generere dette på!
$query = "UPDATE profiler SET newpasswordid = '', password = '" . mysql_real_escape_string($newPassword) . "' WHERE LOWER(email) = '" . mysql_real_escape_string($email) . "' AND newpasswordid = '" . mysql_real_escape_string($id) . "' LIMIT 1"; //Sørg for at kun en række kan blive opdateret!
mysql_query($query) or die(mysql_error()); //Igen fjern når det virker
mail($email, "Nyt kodeord", "Hej, her er dit nye kodeord\n\n" + $newPassword);
return true;
}
Så skulle der vidst være mere end rigelig at gå igang med!