PHP Forgot Password Function

后端 未结 12 847
后悔当初
后悔当初 2020-12-07 08:33

I have a small community website and I need to implement some sort of forgotten password function. I currently store the passwords in the DB, encrypted with MD5.

Is

相关标签:
12条回答
  • 2020-12-07 09:01

    No you cannot decrypt it. that is the whole idea.

    You would need to send them a temp password and for them to reset it.

    0 讨论(0)
  • 2020-12-07 09:03

    An MD5 hashed password is not reversible. (MD5 is hashing, and not really encrypting, so there's a subtle difference). And yes you'll definitely want to provide a password "reset" process (and not simply email the password).

    To give you a high level workflow for secure password resets...

    1. When user asks to reset their password, make them enter their email address
    2. Don't indicate if that email address was valid or not (just tell them that an email was dispatched). This is open for debate as it lowers usability (i.e. I have no idea which email I registered with) but it offers less information to people trying to gather information on which emails are actually registered on your site.
    3. Generate a token (maybe hash a timestamp with a salt) and store it into the database in the user's record.
    4. Send an email to the user along with a link to your https reset page (token and email address in the url).
    5. Use the token and email address to validate the user.
    6. Let them choose a new password, replacing the old one.
    7. Additionally, it's a good idea to expire those tokens after a certain time frame, usually 24 hours.
    8. Optionally, record how many "forgot" attempts have happened, and perhaps implement more complex functionality if people are requesting a ton of emails.
    9. Optionally, record (in a separate table) the IP address of the individual requesting the reset. Increment a count from that IP. If it ever reaches more than, say, 10... Ignore their future requests.

    To give you a little more detail into hashing...

    When you hash a value like a password using the md5() function in PHP, the final value is going to be the same for that password no matter which server you run it on. (So there's one difference we can see right away between hashing and encryption... There's no private/public key involved).

    So this is where you'll see people mention a vulnerability to rainbow tables. A very basic explanation of a rainbow table is... You md5() hash a bunch of dictionary words (weak passwords) in order to get their md5() hashed values. Put those in a database table (rainbow table).

    Now, if you compromise a web site's database, you can run the users' hashed passwords against your rainbow table to (in essence) "reverse" the hash back to a password. (You're not really "reversing" the hash... But you get the idea).

    That's where "salting" your passwords is best practice. This means (again, very basic idea here) that you append a random value to the users' passwords before you hash it. Now, when the rainbow table is run against your database, it's not as easily "reversed" because the md5() hash of "password" is different than "password384746".

    Here's a nice SO Q/A that should help. Secure hash and salt for PHP passwords

    0 讨论(0)
  • 2020-12-07 09:05

    You cannot decrypt the password, and you shouldn't even consider sending a password to a user via plaintext. (That is the #1 way to make me never ever use a site again; it's a GIGANTIC security hole.) Provide a password reset page that is triggered from a link containing a time-associated key that is sent to the user's password recovery email; that's the current state of the art in password recovery.

    0 讨论(0)
  • 2020-12-07 09:06

    Write a page that accepts the md5 and email address as a get paramaeter and looks in the db for the email and md5'd password. Following Jared Cobb notes, that should get you on the right path. i just added some examples as well

    eg url to send http://yourdomain.com/resetpassword.php?code=md5codesentviaemail

     $code = isset($_GET['code']) ? $_GET['code'] : '';
        $email = isset($_GET['email']) ? $_GET['email'] : '';
    $checkPw = '';
    
        if(empty($code) || empty($email))
        {
         die();
        }
        $sqlQuery = 'SELECT * FROM users WHERE email = "'.$email.'";
    //remember to check for sql injections
        //then get the results as an array, i use a database class eg $user
    
        if(!empty($user['password']))
        {
         $checkPw = md5($user['password']);
        }else
        {
         die();
        }
    
        if($checkPw !== $code)
        {
         die();
        }else
        {
        //display form for user to change password
        }
    

    this should be sufficient enough for you to know that the user is a valid user and change his password

    0 讨论(0)
  • 2020-12-07 09:11

    You'll need to do a password reset page. There's no way in PHP to decrypt MD5.

    0 讨论(0)
  • 2020-12-07 09:15

    MD5 is a one way function. You can't decrypt it. SO you need to have a password reset page.

    0 讨论(0)
提交回复
热议问题