簡體   English   中英

忘記密碼頁面,創建一個生成的密碼以電子郵件發送給用戶。

[英]forget password page, creating a generated password to email to the user.

我正在嘗試創建一個忘記密碼頁面。 我聽說通過電子郵件將原始密碼發送給用戶不是一個好主意,因此我試圖創建一個隨機的確認密碼,他們可以使用該密碼登錄他們的帳戶,然后將密碼更改為所需的密碼。 到目前為止,問題在於實際上是用戶數據庫中沒有用戶電子郵件。 另外,我應該更新數據庫以存儲隨機密碼還是使用密碼的方式起作用? 我的數據庫具有表用戶名,用戶名,電子郵件和密碼。 我問用戶以html格式提供其電子郵件地址,然后將其發送到該php格式。 這是我第一次嘗試執行此操作,因此可能會有很多錯誤,但是我找到了可以幫助某些人的教程,因此不應這樣做。 謝謝您的幫助。

<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Sending Password</title>
    </head>
    <body>
        <?php
      $db_server = "server";
       $db_username = "name";
       $db_password = "pass";

       $con = mysql_connect($db_server, $db_username, $db_password);if (!$con)
                {
                    die('Could not connect: ' . mysql_error());
                }

               $database = "Test_Members";  

              $er = mysql_select_db($db_username);
        if (!$er) 
        {
         print ("Error - Could not select the database");
         exit;
        }        

        //include "session.php";


function createRandomPassword() {



    $chars = "abcdefghijkmnopqrstuvwxyz023456789";

    srand((double)microtime()*1000000);

    $i = 0;

    $pass = '' ;



    while ($i <= 7) {

        $num = rand() % 33;

        $tmp = substr($chars, $num, 1);

        $pass = $pass . $tmp;

        $i++;

    }
    return $pass;

}

$password = createRandomPassword();
$password =$_P0ST['password']; 
      $email = $_P0ST['email']; 

        $tbl_name=Account_Holders;


        $sql="SELECT password FROM $tbl_name WHERE email='$email'";
        $result=mysql_query($sql);

        // if found this e-mail address, row must be 1 row
        // keep value in variable name "$count"
        $count=mysql_num_rows($result);


        // compare if $count =1 row
        if($count==1){

        $rows=mysql_fetch_array($result);

        // keep password in $your_password
        $your_password=$rows['password']; //will this replace the users password with the random one? That is what I am attempting to do here. 

        // send e-mail to ...
        $to=$email;

        // Your subject
        $subject="Your Password";

        // From
        $header="from: Feed The Students";

        // Your message
        $messages= "Your password for login to our website \r\n";
        $messages.="Your password is $your_password \r\n";
        $messages.="Please change this password for security reasons. Thank you. \r\n";

        // send email
        $sentmail = mail($to,$subject,$messages,$header);

        }

        // else if $count not equal 1
        else {
        echo "Sorry we did not find your email in our database.";
        }

        // if your email succesfully sent
        if($sentmail){
        echo "Your password has been sent to your email address.";
        }
        else {
        echo "We can not send your password at this time.";
        }



        ?>


    </body>
</html>

首先,您不應該將用戶的密碼存儲在數據庫中-無論如何不是明文形式。 在連接密碼重置問題之前,我將先解決此問題。

一種常見的技術是使用帶鹽的單向哈希算法來轉換密碼(有關更多信息,請參見Wikipedia的鹽定義 ),然后在用戶嘗試登錄時執行相同的加密並比較哈希。

為了使事情變得更加復雜,請嘗試更改每個哈希值的值。

這是我使用的分步方法:

  1. 用戶創建密碼(通過注冊表)
  2. 函數將創建隨機鹽,然后使用SHA256算法和隨機創建的鹽對密碼進行加密。

    $password_salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

    $password_hash = hash('sha256', $salt . $password);

  3. 將$ password_hash和$ password_salt保存到users表。 以后當用戶嘗試登錄時,將使用它們來驗證用戶身份。

  4. 當用戶登錄時,檢查用戶名/電子郵件/登錄,如果找到,則從用戶表中獲取哈希和鹽,並將數據庫中的密碼哈希與對用戶輸入的密碼執行相同功能所返回的哈希進行比較。

    $salt = $user_record['password_salt'];

    $entered_hash = hash('sha256', $salt . $entered_password);

在上述情況下,如果$ entered_pa​​ssword_hash == $ user_record ['password_hash']($ user_record,它來自您的數據庫),則驗證密碼。

注意為了使事情變得更復雜,我實際上將密碼哈希值和鹽值存儲在數據庫的同一字段中。 您可以將它們以一種或另一種方式連接在一起,因此,如果數據庫受到破壞,則密碼字段實際上對於檢索用戶密碼是無用的。

現在,當您要解決忘記的密碼時,您可以創建一個隨機密碼,但是仍然會通過電子郵件發送給用戶,這不是一個好主意,即使是臨時密碼也是如此。 我建議通過電子郵件將鏈接發送給用戶,使他們進入密碼重設頁面。 這是該過程的一些步驟:

  1. 創建一個具有兩列的email_authentication表-用戶ID和密鑰。 這將包含將用戶ID與隨機生成的密鑰相關聯的信息。
  2. 創建一個頁面(例如:reset.php),該頁面需要URL參數(例如$ k),然后在email_authentication表中查找該參數。 如果在表中找到匹配的記錄,請刪除該記錄,然后重定向到一個頁面,該頁面將允許同一記錄中的用戶標識密碼。
  3. 用戶忘記密碼,單擊“忘記密碼”鏈接,然后輸入正確的電子郵件地址。
  4. 在email_authentication表中創建包含其用戶ID的記錄,並為該密鑰生成一個隨機字符串(長32個左右字符)(例如:'r4nd0mstr1ng')
  5. 通過電子郵件向用戶發送指向您在步驟2中創建的頁面的鏈接,其中包含在urlstring中生成的密鑰。 (例如: http//foo.com/reset.php?k = r4nd0mstr1ng
  6. 用戶單擊電子郵件中的鏈接,reset.php中的腳本在email_authentication表中查找“ r4nd0mstr1ng”,並找到與用戶ID關聯的內容,並將其重定向到允許其重置密碼的表單。
  7. 重設密碼后,請勿將其保存為明文!

有關更多信息(也許還可以更好地解釋密碼哈希技術,請參閱HeyBigName的這篇文章該文章基於CodeIgniter,但是其中包含的功能普遍適用。

我建議:1-用戶單擊“忘記密碼”,然后輸入用戶名和/或電子郵件。 您檢查數據庫中是否存在用戶名和/或電子郵件,如果為true,則生成隨機代碼並將其存儲在數據庫中。 2-向用戶發送一封電子郵件,其中包含以下鏈接:wwww.yourwebsite.com/forgot?recovery=CODEGENERATED 3-用戶單擊鏈接,然后檢查代碼是否存在於數據庫中,如果為true,則顯示要填寫的表格新密碼。 用戶填寫,然后保存數據庫。 4-完成。

問題:如果用戶沒有密碼,為什么要求用戶填寫密碼字段?

$password =$_P0ST['password']; 

而且,為什么不使用:

$your_password = createRandomPassword();

代替:

$your_password=$rows['password'];

而且,為什么要這兩行:

$password = createRandomPassword();
$password =$_P0ST['password']; 

第一次生成一個新密碼,但是您將值設置為發布在同一變量上。

需要注意的幾個問題:

  1. 在使用createRandomPassword()創建$ password變量后,立即用$ _POST ['password']中的值覆蓋了它。

  2. 您需要在$ tbl_name的分配周圍加上引號,即:

    $ tbl_name =“帳戶持有人”;

    這可能就是為什么您在數據庫中找不到用戶的電子郵件的原因。

  3. 如果要通過電子郵件將新密碼發送給用戶,則需要更新數據庫中的密碼,以便他們使用新密碼登錄時將與數據庫中的密碼匹配。 為此,您需要使用一條更新語句:

    UPDATE Account_Holders SET密碼='$ password'電子郵件='$ email';

注意:通常,將密碼未加密存儲在數據庫中不是一個好主意。 通常要做的是先將密碼加密,然后再以這種方式存儲在數據庫中。 當您驗證用戶的登錄憑據時,請使用相同的加密算法對他們發送的密碼進行加密,然后將其與數據庫中的內容進行比較。

到目前為止,問題在於實際上是用戶數據庫中沒有用戶電子郵件。

據我所知,您的查詢沒有問題,但是不將$ tbl_name值放在引號中可能沒有幫助。 另外,您是否已經仔細檢查了電子郵件輸入中的name屬性是否也肯定是電子郵件,並且都正確匹配了?

另外,我應該更新數據庫以存儲隨機密碼還是使用密碼的方式起作用?

我通常這樣做的方式是,當他們要求輸入新密碼時,會生成一個令牌以及其用戶ID和電子郵件。 向他們發送包含鏈接的電子郵件,如下所示:

example.com/reset/?id=THERE_ID&token=RANDOM_TOKEN

然后在該頁面上檢查他們是否匹配,如果匹配,請讓他們輸入新密碼。

我聽說通過電子郵件將原始密碼發送給用戶不是一個好主意

hash_hmac ,無論如何,您甚至都不應該在數據庫中存儲原始密碼,而要查找諸如hash_hmac密碼鹽之類的東西-在這些類型的頁面上應該有其他鏈接,以便您可以通過教程/例子。

最后一點,請務必驗證用戶輸入( 例如regex ),因為您使用的是mysql_query ,所以您始終也希望使用mysql_real_escape_string來轉義輸入-查詢的首選方法是使用預處理語句 ,這些對於阻止意外事件發生,例如小擺布桌進入您的站點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM