重新哈希正在更改的密码 PHP

Rehashing a password being changed PHP

我目前遇到散列问题。这是一些背景知识; 用户创建一个帐户,他们的密码使用 password_hash($password, PASSWORD_BCRYPT) 进行哈希处理。然后,当他们登录时,通过 password_verify 检查密码,如果密码正确,他们将登录。

然而,当用户进入他们的个人资料并编辑他们的详细信息,更改他们的密码时,他们将永远无法再次登录。除此之外,如果员工更改了用户密码,他们仍然无法登录。 我一直在尝试环顾四周并解决这个问题,但找不到任何东西,最奇怪的是,当一名员工(比如说管理员帐户)更改另一名员工的密码时,他们可以使用新密码正常登录?我已经完成了与工作更改密码和重新散列代码几乎相同的代码,但它仍然不起作用。

注册:

<?php
        $servername = "localhost"; /*The host of the MySQL name.*/
        $username = "root"; /*MySQL username.*/
        $password = ""; /*MySQL password.*/
        $dbname = ""; /*MySQL database name.*/
        $tablename = "clientinformation"; /*The table name that will be used from the database.*/

        /*This line check if the website can connect to the database, else it will return an error message.*/
        mysql_connect("$servername", "$username", "$password")or die("Cannot connect to the database.");
        /*This line checks if the website can select the database the website is requesting, else it will return an error message.*/
        mysql_select_db("$dbname")or die("Cannot select the database."); 

        $clienttitle = $_POST["clienttitle"]; /*Retrieves the ClientTitle input from the user.*/
        $clientforename = $_POST["clientforename"]; /*Retrieves the ClientForename input from the user.*/
        $clientsurname = $_POST["clientsurname"]; /*Retrieves the ClientSurname input from the user.*/
        $phonenumber = $_POST["phonenumber"]; /*Retrieves the PhoneNumber input from the user.*/ 
        $clientusername = $_POST["clientusername"]; /*Retrieves the Username input from the user.*/
        $clientpassword = $_POST["clientpassword"]; /*Retrieves the ClientPassword input from the user.*/
        $emailaddress = $_POST["emailaddress"]; /*Retrieves the EmailAddress input from the user.*/
        $billingaddress = $_POST["billingaddress"]; /*Retrieves the BillingAddress input from the user.*/
        /*Here, each of the inputs are put through the 'stripslashes' function, which stops a MySQL injection attack.*/
        $clienttitle = stripslashes($clienttitle);
        $clientforename = stripslashes($clientforename);
        $clientsurname = stripslashes($clientsurname);
        $phonenumber = stripslashes($phonenumber);
        $clientusername = stripslashes($clientusername);
        $clientpassword = stripslashes($clientpassword);
        $emailaddress = stripslashes($emailaddress);
        $billingaddress = stripslashes($billingaddress);
        /*The use of mysql_real_escape_string also stops a MySQL injection attack.*/
        $clienttitle = mysql_real_escape_string($clienttitle);
        $clientforename = mysql_real_escape_string($clientforename);
        $clientsurname = mysql_real_escape_string($clientsurname);
        $phonenumber = mysql_real_escape_string($phonenumber);
        $clientusername = mysql_real_escape_string($clientusername);
        $clientpassword = mysql_real_escape_string($clientpassword);
        $emailaddress = mysql_real_escape_string($emailaddress);
        $billingaddress = mysql_real_escape_string($billingaddress);

        $hashedclientpassword = password_hash($clientpassword, PASSWORD_BCRYPT);

            $query = "INSERT INTO $tablename (ClientID, ClientTitle, ClientForename, ClientSurname, PhoneNumber, Username, EmailAddress, ClientPassword, BillingAddress, SignUpDate)VALUES(NULL, '$clienttitle', '$clientforename', '$clientsurname', '$phonenumber', '$clientusername', '$emailaddress', '$hashedclientpassword', '$billingaddress', CURRENT_TIMESTAMP)";

            $result = mysql_query($query);
                if($result){
                    echo "Successful";
                    header("location:Index.php");
                } else {
                    echo ("Unsuccessful : " . mysql_error());
                }
                    mysql_close();
    ?>

检查登录:

<?php
    $servername = "localhost"; /*The host of the MySQL name.*/
    $username = "root"; /*MySQL username.*/
    $password = ""; /*MySQL password.*/
    $dbname = ""; /*MySQL database name.*/
    $tablename = "clientinformation"; /*The table name that will be used from the database.*/

    /*This line check if the website can connect to the database, else it will return an error message.*/
    mysql_connect("$servername", "$username", "$password")or die("Cannot connect to the database.");
    /*This line checks if the website can select the database the website is requesting, else it will return an error message.*/
    mysql_select_db("$dbname")or die("Cannot select the database."); 

    /*This retrieves the data inserted by the user from the previous page. In this case, it is retrieving the username and password the user entered.*/
    $userusername = $_POST["Username"];
    $userpassword = $_POST["ClientPassword"];
    /*Here, these four lines of code are used to stop an MySQL injection attack on the website/database.*/
    $userusername = stripslashes($userusername);
    $userpassword = stripslashes($userpassword);
    $userusername = mysql_real_escape_string($userusername);
    $userpassword = mysql_real_escape_string($userpassword);

    $sql = "SELECT ClientPassword FROM $tablename WHERE Username = '$userusername'";
    $result = mysql_query($sql);
    $datarow = mysql_fetch_array($result);
    $hasheduserpassword = $datarow['0'];

    if (password_verify($userpassword, $hasheduserpassword)) {
        session_start();
        $_SESSION['Username'] = $userusername;
        $_SESSION['ClientPassword'] = $hasheduserpassword;
        header("Location:IndexUserLogin.php");
    } else {
        header("location:WrongPU.php");
    }
?>

正在编辑其详细信息的用户:

<?php
    session_start();
    if(! $_SESSION['Username']) {
        header("location:Index.php");
    }    
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "";
    $tablename = "clientinformation";

    mysql_connect("$servername", "$username", "$password") or die("Cannot connect to the database.");
    mysql_select_db("$dbname") or die ("Cannot select the database.");

    $clientid = $_POST["clientid"];
    $clienttitle = $_POST["clienttitle"];
    $clientforename = $_POST["clientforename"];
    $clientsurname = $_POST["clientsurname"];
    $phonenumber = $_POST["phonenumber"];
    $clientusername = $_POST["clientusername"];
    $emailaddress = $_POST["emailaddress"];
    $clientpassword = $_POST["clientpassword"];
    $billingaddress = $_POST["billingaddress"];

    $clientid = stripslashes($clientid);
    $clienttitle = stripslashes($clienttitle);
    $clientforename = stripslashes($clientforename);
    $clientsurname = stripslashes($clientsurname);
    $phonenumber = stripslashes($phonenumber);
    $clientusername = stripslashes($clientusername);
    $emailaddress = stripslashes($emailaddress);
    $clientpassword = stripslashes($clientpassword);
    $billingaddress = stripslashes($billingaddress);

    $clientid = mysql_real_escape_string($clientid);
    $clienttitle = mysql_real_escape_string($clienttitle);
    $clientforename = mysql_real_escape_string($clientforename);
    $clientsurname = mysql_real_escape_string($clientsurname);
    $phonenumber = mysql_real_escape_string($phonenumber);
    $clientusername = mysql_real_escape_string($clientusername);
    $emailaddress = mysql_real_escape_string($emailaddress);
    $clientpassword = mysql_real_escape_string($clientpassword);
    $billingaddress = mysql_real_escape_string($billingaddress);

    $hashedclientpassword = password_hash($clientpassword, PASSWORD_BCRYPT);

    $query = "UPDATE $tablename SET ClientTitle = '$clienttitle', ClientForename = '$clientforename', ClientSurname = '$clientsurname', PhoneNumber = '$phonenumber', Username = '$clientusername', EmailAddress = '$emailaddress', ClientPassword = '$hashedclientpassword', BillingAddress = '$billingaddress' WHERE ClientID = '$clientid'";
    $result = mysql_query($query);
    if($result) {
        echo "Successful update";
        header("Location:UserCP.php");
    } else {
        echo ("ERROR : " . mysql_errno . " " . mysql_error());
    }
?>

编辑员工详细信息(有效)

<?php
    session_start();
    if($_SESSION['EmployeeUsername'] !== "Admin") {
        header("location:Index.php");
    }
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "";
    $tablename = "employeelogin";

    mysql_connect("$servername", "$username", "$password") or die("Cannot connect to the database.");
    mysql_select_db("$dbname") or die ("Cannot select the database.");

    $employeeid = $_POST['employeeid'];
    $employeeusername = $_POST['employeeusername'];
    $employeepassword = $_POST['employeepassword'];
    $employeename = $_POST['employeename'];
    $employeesurname = $_POST['employeesurname'];

    $employeeid = stripslashes($employeeid);
    $employeeusername = stripslashes($employeeusername);
    $employeepassword = stripslashes($employeepassword);
    $employeename = stripslashes($employeename);
    $employeesurname = stripslashes($employeesurname);

    $employeeid = mysql_real_escape_string($employeeid);
    $employeeusername = mysql_real_escape_string($employeeusername);
    $employeepassword = mysql_real_escape_string($employeepassword);
    $employeename = mysql_real_escape_string($employeename);
    $employeesurname = mysql_real_escape_string($employeesurname);

    $hashedemployeepassword = password_hash($employeepassword, PASSWORD_BCRYPT);

    $query = "UPDATE $tablename SET EmployeeID = '$employeeid', EmployeeUsername = '$employeeusername', EmployeePassword = '$hashedemployeepassword', EmployeeName = '$employeename', EmployeeSurname = '$employeesurname' WHERE EmployeeID = '$employeeid'";
    $result = mysql_query($query);
    if($result) {
        echo "Successful update";
        header("Location:EmployeeCP.php");
    } else {
        echo ("ERROR : " . mysql_errno . " " . mysql_error());
    }
?>

检查员工登录(工作)

<?php
    $servername = "localhost"; /*The host of the MySQL name.*/
    $username = "root"; /*MySQL username.*/
    $password = ""; /*MySQL password.*/
    $dbname = ""; /*MySQL database name.*/
    $tablename = "employeelogin"; /*The table name that will be used from the database.*/

    /*This line check if the website can connect to the database, else it will return an error message.*/
    mysql_connect("$servername", "$username", "$password")or die("Cannot connect to the database.");
    /*This line checks if the website can select the database the website is requesting, else it will return an error message.*/
    mysql_select_db("$dbname")or die("Cannot select the database."); 

     /*This retrieves the data inserted by the user from the previous page. In this case, it is retrieving the username and password the employee entered.*/
    $employeeusername = $_POST["EmployeeUsername"];
    $employeepassword = $_POST["EmployeePassword"];
    /*Here, these four lines of code are used to stop an MySQL injection attack on the website/database.*/
    $employeeusername = stripslashes($employeeusername);
    $employeepassword = stripslashes($employeepassword);
    $employeeusername = mysql_real_escape_string($employeeusername);
    $employeepassword = mysql_real_escape_string($employeepassword);

    $sql = "SELECT EmployeePassword FROM $tablename WHERE EmployeeUsername = '$employeeusername'";
    $result = mysql_query($sql);
    $datarow = mysql_fetch_array($result);
    $hashedemployeepassword = $datarow['0'];

    if (password_verify($employeepassword, $hashedemployeepassword)) {
        session_start();
        $_SESSION['EmployeeUsername'] = $employeeusername;
        $_SESSION['EmployeePassword'] = $hashedemployeepassword;
        header("Location:IndexEmployeeLogin.php");
    } else {
        header("location:WrongPU.php");
    }
?>

为所有人和任何回应干杯

  1. 删除所有对 stripslashes()mysql_real_escape_string() 的密码输入调用,函数 password_hash() and password_verify() 甚至接受二进制输入并且不易 SQL-injection。我认为这已经解决了您的问题。

转义应该尽可能晚地进行,并且只针对给定的目标系统,所以函数 mysqli_real_escape_string() 应该只被调用来构建一个 SQL 查询。

  1. 检查两个表(clientinformationemployeelogin)中的 password-hash 字段是否声明了 60 个或更多字符。
  2. 如果这不能解决您的问题,我会为您的所有页面使用 UTF-8。您可以使用此 W3C checker 检查您的页面,每个页面都应以 UTF-8 文件格式存储并定义 UTF-8 header.
  3. 用isset测试变量是否存在:if(!isset($_SESSION['Username']))
  4. 密码哈希不应存储在 session 中,但也许这仅用于测试目的。
  5. 不需要设置用户标识:"UPDATE $tablename SET EmployeeID = '$employeeid', ... WHERE EmployeeID = '$employeeid'";

并且总是在重定向后调用 exit 是一个好习惯:

header('Location: Index.php', true, 303);
exit;