Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  10 776
Heihei folkens. Holder på å lage et tekstbasert mafiaspill, ja jeg vet det finnes mange av dem, men det er en del penger i det, og jeg tenker jeg lærer mye av prosessen.

Det jeg lager nå er en glemtpassord funksjon. Så når folk glemmer passordet sitt, går de inn på en side, skriver mailadresse, mottar mail med ny link, og når de har gått inn der får de en siste mail med nytt passord. Passordet skal jo helst endre seg i databasen. Dette har jeg ikke fått til, aner ikke hvorfor.

Ja, jeg skal legge til sha1 når passordet legges inn, men gjør det senere, må først få det til å funke. Nå som jeg allerede lager en post, kan jeg jo også spørre hvordan jeg setter en timelimit på dette. F.eks. hvis jeg vil at de bare skal kunne utfære denne handlingen hver halve time, for å preventere bots. Her er en kodesnutt, bare spør hvis noe er uklart


Kode

    //Lettere variabelnavn
        $email = $_POST['epost'];
            // Se etter brukernavn og passord der mail er $_POST['epost']
        $result = Database::query("SELECT username, password FROM users WHERE email = '".Database::escape($email)."'");
        $row = Database::farray($result);
        $brukernavn = $row['username'];
        $password = $row['password'];
                    //Er $_GET verdien 'stegen'
        if($_GET['p'] == 'stegen') {
        $printBack = psucc('Du vil nå få tilsendt et nytt passord på mailen din','style="width:450px"', TRUE);
            // Lag en ny beskjed med nytt passord i
        $newPassword = genRandomString();
        $message = "Ditt nye passord er:  ".$newPassword."'/n' Vi foreslår at du skifter passord første gang du logger inn med det nye. '/n' Peace out '/n' Elitecrimes Ledelsen" ;
        mail("random@gmail.com", "Konfirmasjonsmail", $message);
        Database::query("UPDATE users SET password = '".Database::escape($newPassword)."' WHERE password = '".Database::escape($password)."'");

Peace out!
Først en ting: Det er ikke smart å overskrive det gamle passordet når noen bruker "glemt passord"-funksjonen. For da kan jo ondsinnede folk bruke denne funksjonen mot noen de misliker, og så må offeret plutselig forandre passord tilbake igjen. Send heller en aktiverings-link som brukeren aktivt må gå inn på for å få nytt passord.

Når dette er gjort, så er det lett å legge inn en sperre - du bare lagrer tidspunktet brukeren brukte "glemt passord", og kan da sjekke om det har gått en halvtime eller whatever siden sist de gjorde det.
- Brukeren går inn på "glemt passord"
- Brukeren må skrive inn epost adressen sin
- Brukeren får en confirmation lenke
- Brukeren går inn på den lenken
- Siden det lenkes til genererer nytt passord og sender epost til brukeren med nytt passord
Identifiserer du brukeren med passordet?

UPDATE users SET password = '".Database::escape($newPassword)."' WHERE password = '".Database::escape($password)."'

Hva om hvis fler har samme passordet?


Får du forresten en feilmelding du kan dele?
Sist endret av Diox; 5. november 2010 kl. 01:15.
Timelimit:

1. Lagre timestamp i databasen ved hver endring.
2. Ved hver endring, sammenlign timestamp for akkurat nå og det som er lagret i databasen.
ymgve: Det kan man nemlig ikke, for de må gå inn på den første linken før det skjer noe som helst.

Diox: Ingen feilmelding nei, men sant det du sier. Burde identifisere med brukeren

Danielsk: Takk skal se om det funker

Diox, jeg kom på noe nå. Grunnen til at det ser ut som jeg ikke gjør det, er at du ikke kan se hele koden, men lenger opp i koden kan man se at $password blir identifisert med mailadressen man skriver inn. Og den kan jo ikke være felles hos flere
Du oppdaterer fortsatt etter passordet, uansett hvor du fikk passordet fra, så vil alle med samme passord (med mindre du har et unikt salt for hver bruker) endres når du bruker den spørringen der.

HVA er det som ikke fungerer egentlig? Er det oppdateringen av passordet eller sending av e-posten?
Det er oppdatering av passordet som er problemet. Ja, jeg oppdaterer etter $password, ikke etter password. Skjønner ikke poenget ditt? Du kan godt få se mer av koden så du kanskje skjønner hva jeg mener.

Kode

if(isset($_POST['epost'])) {
        //Se etter mailen i databasen
    $result = Database::query("SELECT email FROM users WHERE email='" . Database::escape($_POST['epost']) . "' ");


        //Finnes mailen i databasen?
    if($row = Database::fobject($result)) {
        //Lettere variabelnavn
        $email = $_POST['epost'];
            // Mail variabler
        $to = $email;
              // random kode til enden av konfirmasjonslink
        $confirm_code = md5(uniqid(rand()));
        $message = 'Hei ".$brukernavn."! \n\n';
        $message .= 'Klikk på linken under for å få tilsendt et nytt passord: \n';
        $message .= $config['domenet'].'?side=glemt_pass&p=stegen&key='.$confirm_code;
        $subject = 'Glemt passord';
            // Send mailen
        sendMail($to, $subjet, $message);
            // random kode til enden av konfirmasjonslink
        $printBack = psucc('E-post sendt til: ' . $_POST['epost'] . '','style="width:450px"', TRUE);
    } else {
            // Ble ikke mailen funnet? Da stopper vi her.
        $printBack = pfail('Det er ikke registrert noen bruker med denne epost-adressen.',  'style="width:450px"', TRUE);

    }

}
Koden her er stort sett alt som er før den andre delen av koden jeg la ut. Nå ser du kanskje at den ikke endrer alle med samme passord, den er jo peilet inn på en row i databasen allerede.
Du kan jo eks. gjøre slik.

Bruker fyller inn skjema med e-post adresse. (reset_passord.php)

Kode

<?php
$ret .= 'bla bla bla passord.. osv...';
$ret .= '<form action="reset.php" method="POST">';
$ret .= '<input type="text" name="epost">';
$ret .= '<input type="submit" value="Send nytt passord">';
$ret .= '</form>';
echo $ret;
?>
Da kommer brukeren til denne filen. reset.php
Som kan se slik ut. (bruker ditt eksempel.)

Kode

//Lettere variabelnavn
$email = $_POST['epost'];
// Se etter brukernavn og passord der mail er $_POST['epost']
$result = Database::query("SELECT username, password FROM users WHERE email = '".Database::escape($email)."'");

$row = Database::farray($result);
$brukernavn = $row['username'];
$password = $row['password'];
//Er $_GET verdien 'stegen'
if($_GET['p'] == 'stegen') {
$printBack = psucc('Du vil nå få tilsendt et nytt passord på mailen din','style="width:450px"', TRUE);
// Lag en ny beskjed med nytt passord i
$newPassword = genRandomString();
$message = "Ditt nye passord er:  ".$newPassword."'/n' Vi foreslår at du skifter passord første gang du logger inn med det nye. '/n' Peace out '/n' Elitecrimes Ledelsen" ;
mail("random@gmail.com", "Konfirmasjonsmail", $message);
$newPassword = SHA5($newPassword);
Database::query("UPDATE users SET password = '".Database::escape($newPassword)."' WHERE epost = '".Database::escape($epost)."'");
Tror det blir noe slikt sånn i full fart her

Du bør også ha med at brukeren skriver inn både brukernavn og epost når de vil ha nytt passord.
Da kan scriptet sjekke om både e-post og brukernavn stemmer.
flodulv: jeg vil helst at de bare skal skrive inn e-mail, sånn at den som eier e-postadressen heller bare må bekrefte. Hva hvis de har glemt brukernavn også? :P
da kan du forsøkje noe slikt som jeg har skrevet i eksemplet