你能检查一下我的代码有什么问题吗?因为它通过了验证,但没有用新密码更新我的旧密码。。。我甚至尝试在成功更新后回显值,最后它会返回我的旧密码,而不是新密码。
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Profilio redagavimas</title>
<link href="CSS/stilius.css" rel="stylesheet" type="text/css"/>
<link href="CSS/menu.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<?php require("includes/validate.php");?>
<?php require("includes/stilius.php");?>
<?php
echo "Jūsų vardas: ".$row["name"]."<br>";
echo "Jūsų miestas: ".$row["city"]."<br>";
echo "Jūsų telefono numeris: ".$row["phone"]."<br>";
if(strlen($row["web"]) > 0)
echo "Jūsų svetainės adresas: ".$row["web"]."<br>";
else
echo "Registracijos metu neįvedėte savo svetainės adreso."."<br>";
echo "pass";
?>
<form method='post' action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<td>Old Password:</td>
<td><input name='oldpw' type='password' required='required'/></td>
<tr>
<td>New Password:</td>
<td><input name='newpw' type='password' required = 'required' /></td>
<tr>
<td>Confirm Password:</td>
<td><input name='conpw' type='password' required = 'required' /></td>
<td>
<input type='submit' value='Pakeisti slaptažodį' />
</td>
</tr>
</form>
<?php
if (isset($_POST['newpw'])){
$newpwd = mysql_real_escape_string(md5($_POST['newpw']));
if (md5($_POST['oldpw'])== $row['pass'])
{
if ($_POST['newpw']==$_POST['conpw'])
{
if(mysql_query("UPDATE vartotojai SET pass='$newpwd' WHERE 'V_ID' = '{$_SESSION['user_id']}'"))
{
echo $newpwd."<br>";
echo $_SESSION['user_id']."<br>";
echo "Slaptažodis sėkmingai pakeistas"."<br>";
echo $row['pass'];
}
else {echo "Klaida: " .mysql_error();}
}
else { echo "Slaptažodžiai nesutampa"; }
}
else { echo "Įvestas blogas senas slaptažodis";}
}
?>
<?php mysql_close(); ?>
<?php require("includes/footer.php");?>
</body>
</html>
编辑:已解决感谢Shankar Damodaran。
$newpwd = mysql_real_escape_string(md5($_POST['newpw']));
这条单行线内的方法完全错误,原因有几个:
由于转义,您允许多个密码与同一哈希匹配。因此,订单是错误的,应该是:
$newpwd = mysql_real_escape_string(md5($_POST['newpw']));
更进一步,您甚至不需要转义md5哈希,因为它只由字母数字十六进制数字组成:
$newpwd = md5($_POST['newpw']);
使用无salt的md5密码哈希与使用明文密码完全相同。即使加了盐,它仍然很不安全。备选方案:
http://php.net/function.password-hash
https://github.com/ircmaxell/password_compat
问题本身就在更新中:
"UPDATE vartotojai SET pass='$newpwd' WHERE 'V_ID' = '{$_SESSION['user_id']}'"
应该是
"UPDATE vartotojai SET pass='" . $newpwd . "' WHERE V_ID = '" . $row["V_ID"] . "'"
使用您已经选择的V_ID(我想您已经选择了)比使用会话中的内容更安全。列周围的普通单引号告诉MySQL"这不是列"。
尝试这个
$session_user_id = $_SESSION['user_id'];
if(mysql_query("UPDATE `vartotojai` SET `pass`='$newpwd' WHERE `V_ID` = '$session_user_id' LIMIT 1 "))
{
注意:mysql_*
不推荐使用mysqli_*
或pdo