Php 5.5 修改密码

Php 5.5 change password

编辑: 在 config.php 我创建并维护会话。以及通过连接到 MySQL.

我正在尝试学习如何使用 PHP 5.5 Password_hash 和 password_verify 作为更多的学习经验然后其他任何东西,我没有这样做太久,这是第一次在这里提问(通常已经有人问过我的问题了)

所以这是我的问题。

当我注册和登录时,我可以让 password_hash 和 password_verify 正常工作。但是由于某些原因,当我使用脚本更改密码时,我无法再登录。

相关代码片段:

注册:

<?php
include('config.php');

$password = mysql_real_escape_string($_POST['password']);
$username = mysql_real_escape_string($_POST['username']);

$hashed_password = password_hash($password, PASSWORD_DEFAULT);

$sql = 'INSERT INTO Staff (username, password) ' .
"VALUES ('$username', '$hashed_password')";

mysql_query($sql) or die( mysql_error() );

?>

注册 HTML:

<div id="login-content">
<form action="register.php" method="post">
<fieldset id="inputs">
<div class="label"></div><input type="text" name="username"/><br />
<div class="label"></div><input type="password" name="password"/><br />
</fieldset>
<input class="button" type="submit" value="Register" />
</form>
</div>   

修改密码:

<?php
include('config.php');

$password = mysql_real_escape_string($_POST['newPassword']);
$password2 = mysql_real_escape_string($_POST['confirmPassword']);
$username = ($_SESSION['username']);


if ($password <> $password2) { 
echo "Your passwords do not match.";
}
else if ($password === $password2){

$hashed_password = password_hash($password, PASSWORD_DEFAULT);


$sql = "UPDATE Staff SET password='$hashed_password' WHERE username='$username'";

mysql_query($sql) or die( mysql_error() );
}
else { mysqli_error($con); }

mysqli_close($con);
?>

ChangePwdHTML:

<?php
include('config.php');
?>
<div id="login-content">
<form action="changePassword.php" method="post">
<fieldset id="inputs">
<div class="label"></div><input type="password" name="passwordNew"/><br />
<div class="label"></div><input type="password" name="passwordConfirm"/><br />
</fieldset>
<input class="button" type="submit" value="Change Password" />
</form>
</div>

连接:

<?php
include('config.php');
        $username = mysql_real_escape_string(stripslashes($_POST['username']));
        $password = stripslashes($_POST['password']);

    $sql = ('SELECT password,id,rank FROM Staff WHERE username="'.$username.'"');
    $req = mysql_query($sql) or die( mysql_error() );
    $dn = mysql_fetch_assoc($req);
    $hash = $dn['password'];

    if(password_verify($password, $hash))
    {
        $_SESSION['username'] = $_POST['username'];
        $_SESSION['userid'] = $dn['id'];
        $_SESSION['rank'] = $dn['rank'];
        $username = mysql_real_escape_string(stripslashes($_POST['username']));
        $password = stripslashes($_POST['password']);
?>

我确信我的代码很乱,其中一些已经过时了……在这一点上它有点……弗兰肯代码,是根据我找到的各种示例和教程构建的。

很难看出确切的问题是什么,但一个潜在的问题是您在注册/更改密码和检查时以不同的方式处理密码:您使用 mysql_real_escape_string 当您设置它但是 strip_slashes 当你比较它时。

这会导致包含引号或斜杠的密码在您尝试登录时不匹配。

您根本不应该触摸用户的密码,因为密码可以包含斜杠、引号等。

相反,您应该切换到 PDO 或 mysqli 并使用准备好的语句并且不要更改用户的输入,除非您验证新的用户名。


name="passwordConfirm"$_POST['confirmPassword'] 是其中一个问题,另一个问题也是如此 name="passwordNew"$_POST['newPassword'] 你倒置了单词。

使用错误报告 http://php.net/manual/en/function.error-reporting.php 会为两者发出 "Undefined index...." 信号。