编辑:在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']);
?>
我确信我的代码非常混乱,其中一些已经过时了...它的那种...这是一段时间的代码,是根据我发现的各种示例和教程构建的。
答案 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 ....”信号。