Avatar billede JJ77 Juniormester
03. april 2006 - 18:46 Der er 8 kommentarer og
1 løsning

få tilsendt password, fra email i stedet for brugernavn

Jeg har nedenstående script hvor en bruger kan indtaste sit brugernavn hvis han har glemt sit password. Han får så automatisk tilsendt et nyt. Jeg ville nu bare hellere have at det var brugerens email som skulle indtastes i stedet for. kan det umiddelbart lade sig gøre?
Brugerens email ligger i en anden tabel end userName.. Den ligger i en tabel ved navn "userProfile" felt userEmail

<?PHP
require_once('common.php');
session_start();

function reset_password($newPass, $userName)
{
    $query = "update users set userPassword = password('$newPass') where username='$userName'";
    $result = mysql_query($query);
    return mysql_errno();
}

function gen_password()
{
    $str="abcdefghijklmnopqrstuvwxyz01234567890";
    srand((double)microtime()*1000000);

    for($i=0; $i < 6 ; $i++)
    {
        $password .= $str[rand(0,62)];
    }
    return $password;
}

if(!isset($_REQUEST['submit']))
{
?>

<form action="reminder.php" method="post">
<table width="540" border="0" cellspacing="2" cellpadding="0">
    <tr>
    <td>
                <h4><? echo $msg_password_reminder; ?></h4>
            </td>
    </tr>
   
   
    <tr>
        <td><input type="text" name="username" size="24" border="0">  <input type="submit" name="submit" value="Send adgangskode" border="0"></td>
    </tr>
   
        </table>
            </form>
       
<?PHP
}
else
{
    if(is_valid_referer())
    {   
        $username = sanitize_variable($_REQUEST['username']);
       
        $email = get_email($username);
        if($email!="")
        {

            $pwd = gen_password();
            if(reset_password($pwd,$username) != 0)
            {
                err_message('Dit password kunne ikke blive nulstillet');
            }
            else
            {

                $fmt = join("",file("reminder.txt"));
                $message = sprintf($fmt,$username,$pwd);
                mail($email,"Ny adgangskode",$message,"From: $member_service_email\n");
                err_message($msg_pass_changed);
               

            }
        }
        else
        {
            err_message('Din nye adgangskode kunne ikke blive sendt til dig, da du ikke har indtastet et gyldigt brugernavn. Tryk <a href="signup.php">HER</a> og opret dig som ny bruger.');
        }
    }
    else
    {
        err_message('Un-authorized access detected your ip has been logged');
       
    }
}

?>
Avatar billede jensgram Nybegynder
03. april 2006 - 18:57 #1
Ja, det skulle ikke være det store problem, hvis du udskifter "where username='$userName'" med "where mail='$userMail'" osv.

Du skal bare sørge for, at mail nu bliver unik, så to brugere ikke har samme mail. Desuden vil det nok være en god idé at sende en "anmodning om kvittering" til mail-adressen, så en ny kode først genereres, hvis et validerings-link sendt pr. mail bliver aktiveret.

Ellers risikerer du, at brugere får nulstillet koder efter andres ønske...
Avatar billede JJ77 Juniormester
03. april 2006 - 19:03 #2
ok.. ka jeg ikke logge dig til at vise mig hvor jeg skal ændre i scriptet.. kan nemlig ikke få det til at virke:(
Avatar billede jensgram Nybegynder
04. april 2006 - 09:56 #3
Så skal du først poste strukturen for de to tabeller: users og userProfile
Avatar billede JJ77 Juniormester
04. april 2006 - 16:50 #4
Jeg har tænkt over det med at det skal være ens email man skal indtaste i stedet.. tror faktisk at det er en dum løsning alligevel, da man faktisk kan se brugernes emails på siden... men hva fann gør man så for at undgå misbrug.. er bare totalt bange for at en som tror han er sjov kunne finde på at indtaste en masse brugernavne og på den måde slette folks passwords så intet virker:(


CREATE TABLE `users` (
  `userId` int(12) NOT NULL auto_increment,
  `userStatus` tinyint(4) NOT NULL default '0',
  `userName` char(40) NOT NULL default '0',
  `userPassword` char(48) NOT NULL default '0',
  `sidsteBesoeg` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`userId`),
  UNIQUE KEY `userName` (`userName`)
) TYPE=MyISAM AUTO_INCREMENT=158 ;

CREATE TABLE `userProfile` (
  `userId` int(12) NOT NULL default '0',
  `userFirstName` varchar(64) NOT NULL default '',
  `userEmail` varchar(64) NOT NULL default '',
  `userLastName` varchar(64) NOT NULL default '',
  `userCompany` varchar(15) NOT NULL default '',
  `userAddr1` varchar(64) NOT NULL default '',
  `userAddr2` varchar(64) NOT NULL default '',
  `userCity` varchar(64) NOT NULL default '',
  `userState` varchar(64) NOT NULL default '',
  `userCountry` varchar(64) NOT NULL default '',
  `userTel` varchar(15) NOT NULL default '',
  `userMobiTel` varchar(15) NOT NULL default '',
  `userHomeTel` varchar(15) NOT NULL default '',
  `userFax` varchar(15) NOT NULL default '',
  `userZip` varchar(10) NOT NULL default '',
  `userWeb` varchar(128) NOT NULL default '',
  `userValidationKey` varchar(32) NOT NULL default '',
  `userIP` varchar(32) NOT NULL default '',
  `userSignUp` datetime NOT NULL default '0000-00-00 00:00:00',
  `userValidated` tinyint(1) NOT NULL default '0',
  `userNewsLetter` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`userId`)
) TYPE=MyISAM;
Avatar billede jensgram Nybegynder
04. april 2006 - 18:02 #5
Du lader folk indtaste ENTEN mail eller brugernavn - begge dele valideres i henhold til databasen, så det indtastede skal være gyldigt.

Herefter sender du dem en mail (som nu er valideret), hvor der er en forklarende tekst ("denne mail er sendt fra site.dk, da du har angivet, at du ikke kan huske dit password..."). Desuden findes et link til en password-eraser-og-generator:

site.dk/users/resetpwd.php?mail=modtager@brugere.dk&key=ENELLERANDETVALIDERING

resetpwd.php kan så bede brugeren om at indtaste sit nye, ønskede password, da $key bekræfter, at han virkelig ER den korrekte modtager (det bliver genereret inden afsendelse og indsættes i en tabel - se nedenfor).

Herefter er passwordet ændret og brugeren kan komme til.


Hvordan bliver $key så unik?
Lav en tabel med mail, tilhørende key og timeout (man kan jo forlange, at brugeren ændrer sit pwd indenfor 2 dage, når han har anmodet om nyt pwd)...

mail | key | timeout

key genereres så - evt. via:

$key = md5(uniqid(rand(), true));

Så er det en 32-tegns hex-streng...


Hjalp det?

- Jens Gram
Avatar billede JJ77 Juniormester
05. april 2006 - 20:04 #6
Puha.. det lyder sq lidt trikky.. kommer sku nok til at tage en krig af få det lavet ;-).. ved ikke om jeg bare skal droppe det
Avatar billede jensgram Nybegynder
06. april 2006 - 09:29 #7
Nej, det behøver altså ikke være så svært, men det tager selvfølgelig lidt tid. På den anden side, så kunne du lade dit nuværende system fungere for nu, og så have det andet i baghovedet, hvis det virkelig viser sig, at der sker mange uønskede "resets".

- Jens Gram
Avatar billede JJ77 Juniormester
06. april 2006 - 10:15 #8
Ja.. det bliver sq nok den model jeg vil følge.. hvis der endelig skulle komme misbrug kan jeg jo bare slå muligheden fra, til jeg får lavet en ordentlig og sikker måde at resette password på.. men tak for hjælpen.. smider du ikke lige et svar :)
Avatar billede jensgram Nybegynder
06. april 2006 - 11:33 #9
!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester