簡體   English   中英

PHP用戶通過電子郵件和舊密碼更改帳戶密碼

[英]PHP user changing password on his account via email and old password

我在php中創建了一個API,供用戶更改其帳戶密碼,但我這樣做是為了讓他們通過輸入電子郵件來更改密碼,因此我在數據庫中找到了這樣的列,但是出於安全考慮,我認為這是個好主意...所以我想添加它,以便它通過電子郵件找到用戶,然后檢查他的舊輸入密碼是否與數據庫中加密的密碼匹配,所以他的輸入將是1)電子郵件2)舊密碼3)新通行證。 我的密碼已用哈希+鹽加密

這是我的php文件

<?php
require_once('connection.php');

function forgotPassword($forgotpassword, $newpassword, $salt){
    $result = mysql_query("UPDATE `member` SET `encrypted_password` = '$newpassword',`salt` = '$salt' WHERE `email` = '$forgotpassword'");
    if ($result) {
    return true;
    }
    else
    {
    return false;
    }
}
function hashSSHA($password) {
    $salt = sha1(rand());
    $salt = substr($salt, 0, 10);
    $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
    $hash = array("salt" => $salt, "encrypted" => $encrypted);
    return $hash;
}
function isUserExisted($email) {
    $result = mysql_query("SELECT email from member WHERE email = '$email'");
    $no_of_rows = mysql_num_rows($result);
    if ($no_of_rows > 0) {
        // user existed
        return true;
    } else {
        // user not existed
        return false;
    }
}

$email = $_POST['email'];
$newpassword = $_POST['newpas'];
$hash = hashSSHA($newpassword);
$encrypted_password = $hash["encrypted"]; // encrypted password
$salt = $hash["salt"];
if (isUserExisted($email)) {
        $user = forgotPassword($email, $encrypted_password, $salt);
    if ($user) {
    //pass changed
}
else {
    //error
}
    // user is already existed - error response
}
   else {
    //user not found
}
?>

有人可以給我寫一個解決方案嗎? 因此,它會檢查數據庫中的電子郵件和舊密碼。

聽起來像您要找的是一個簡單的密碼驗證。 在您的情況下,它看起來像:

function checkPass ($salt, $password, $storedPass){
  $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
  if($storedPass==$encrypted){
    return TRUE;
  }
  else{
    return FALSE;
  }

當然,您必須首先從數據庫中挖掘$salt的值。

如果我理解正確,那么您正在尋找“ Forgot Password的解決方案。 在這種情況下,明顯的情況是用戶不記得當前密碼,而是想要設置一個新密碼。

我假設您有一個“ Forgot Password鏈接,該鏈接會轉到“ Forgot Password頁面,在該頁面中,用戶輸入Email Address然后單擊“下一步”。

如果您的系統已經存儲了秘密問題和答案,則可以在此處添加步驟以檢查其中至少一項,否則,請繼續進行以下操作:

  • 驗證Email Address
  • 如果存在Email Address ,請繼續。 否則向用戶顯示消息。
  • 生成一個(冗長的) Random String
  • Random String保存在該用戶的(用戶)表中。
  • 建立一個Link並在其中添加Email AddressRandom String
  • 制作包含Link的電子郵件,並將其發送到Email Address

現在,用戶收到電子郵件並單擊Link

  • 解析Link以獲取Email AddressRandom String
  • 驗證Email AddressRandom String
  • 如果存在Email AddressRandom String組合,請繼續。 否則向用戶顯示消息。
  • 顯示一個表單供用戶輸入兩次“ New Password
  • 為用戶保存New Password

現在,您可以Sign In自動將用戶或顯示Sing In頁面供用戶使用新的憑證登錄。

好的 ,如果用戶已經登錄並打算更改密碼:

假設您具有“ Change Password鏈接:

當用戶單擊“ Change Password鏈接時:

  • 顯示“ Change Password表單。
  • 用戶輸入Old Password
  • 用戶輸入New PasswordRetype New Password

已經登錄的用戶,您可以使用userId或emailAddress,也可以從(user)表中檢索。

所以現在:

  • 驗證舊密碼。
  • 確保“ New Password和“ Retype New Password相同。
  • 確保新密碼符合您的密碼標准。
  • 一切正常,請保存新密碼。

現在,如果您的系統允許多個用戶登錄同一帳戶,則明智的做法是自動注銷所有這些用戶,然后要求再次登錄。

暫無
暫無

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

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