【问题标题】:PHP user changing password on his account via email and old passwordPHP用户通过电子邮件和旧密码更改其帐户的密码
【发布时间】:2014-01-16 01:11:43
【问题描述】:

我在 php 中创建了一个 API,供用户更改他们帐户的密码,但我这样做是为了让他们通过输入电子邮件来更改它,所以我在数据库中找到了他们的列,但出于安全原因,我不这样做'认为这不是一个好主意......所以我想添加它以便它通过电子邮件找到用户然后检查他输入的旧密码是否与数据库中的加密相匹配,所以他的输入将是 1)电子邮件 2)旧通行证 3) 新通行证。我的密码是用 hash + salt 加密的

这是我的 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
}
?>

谁能给我写一个解决方案?因此它会检查数据库中的电子邮件和旧密码。

【问题讨论】:

  • 如果我理解你的话,你想检查用户输入的旧密码是否正确,如果是,那么用户可以更改密码,对吧?如果是这样,那么您可以使用简单的 if 语句来完成,if(oldPass == pass) 继续
  • 让他们先登录,如果他们已登录则更改密码。Could anyone write me a solution for this? 我们不是来为您编写代码,而是帮助您指明正确的方向。
  • 请不要使用mysql_*,而应使用mysqli_*。 mysql_* 已折旧。你也很容易被注射。请使用准备好的语句或PDO。
  • @Alen 好的,但是如何从我的表中选择 2 列然后我可以比较?
  • @Simon_says 您不需要比较两列,使用 POST['newpas'] 变量中的密码并将其与数据库中的密码进行比较

标签: php mysql database hash change-password


【解决方案1】:

好的如果用户已经登录并打算更改密码:

假设您有一个Change Password 链接:

当用户点击Change Password链接时:

  • 显示Change Password 表单。
  • 用户输入Old Password。
  • 用户输入New Password和Retype New Password。

用户已经登录,您要么拥有 userId 或 emailAddress,要么您可以从 (user) 表中检索。

所以现在:

  • 验证旧密码。
  • 确保New Password 和Retype New Password 相同。
  • 确保新密码符合您的密码标准。
  • 保存新密码一切正常。

现在,如果您的系统允许多个用户登录同一个帐户,明智的做法是自动退出所有这些用户并要求重新登录。

【讨论】:

    【解决方案2】:

    听起来您正在寻找一个简单的密码验证。在您的情况下,它看起来像:

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

    当然,您必须先从数据库中挖掘出$salt 的值。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您正在寻找 Forgot Password 的解决方案。如果是这种情况,很明显的情况是用户不记得当前密码并想设置一个新密码。

      我假设您有一个 Forgot Password 链接,该链接指向一个 Forgot Password 页面,用户在该页面中输入 Email Address 并单击 Next 。

      如果您的系统已经存储了秘密问题和答案,您可以在此处添加步骤以检查其中至少一项,否则只需继续:

      • 验证Email Address。
      • 如果Email Address 存在,请继续。否则向用户显示消息。
      • 生成一个(冗长的)Random String。
      • 将Random String 保存在该用户的(用户)表中。
      • 创建一个Link 并将Email Address 和Random String 放入其中。
      • 制作包含Link 的电子邮件并将其发送至Email Address。

      现在用户收到电子邮件并点击Link:

      • 解析Link得到Email Address和Random String。
      • 验证Email Address 和Random String。
      • 如果存在Email Address 和Random String 组合,请继续。否则向用户显示消息。
      • 显示一个表单供用户输入两次New Password。
      • 为用户保存New Password。

      现在您可以自动Sign In 用户或显示Sing In 页面让用户使用新凭据登录。

      【讨论】:

      • 不,我已经为忘记密码做了这个,现在我想在帐户页面中制作这个以用于更改它
      猜你喜欢
      • 2015-06-10
      • 2012-06-24
      • 2014-05-24
      • 1970-01-01
      • 2019-07-26
      • 2014-12-02
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多