PHP 5.5更改密码

时间:2015-04-07 15:59:49

标签: php passwords

编辑:在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() );

?>

RegisterHTML:

<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>   

ChangePwd:

<?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']);
?>

我确信我的代码非常混乱,其中一些已经过时了...它的那种...这是一段时间的代码,是根据我发现的各种示例和教程构建的。

1 个答案:

答案 0 :(得分:1)

很难看出确切的问题是什么,但潜在的问题是,当您注册/更改密码时以及在检查时以不同方式处理密码:设置时使用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 ....”信号。