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...." 信号。
编辑: 在 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...." 信号。