你能查看我的代码有什么问题吗?因为它通过了验证,但没有用新的密码更新我的旧密码...我甚至尝试在成功更新后回显值,最后它返回我的旧密码而不是新密码。
<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。
答案 0 :(得分:1)
$newpwd = mysql_real_escape_string(md5($_POST['newpw']));
由于以下几个原因,这一行中的方法完全错误:
由于转义,您允许多个密码匹配相同的哈希。因此,订单是错误的,应该是:
$newpwd = mysql_real_escape_string(md5($_POST['newpw']));
更进一步,您甚至不需要转义md5哈希,因为它只包含字母数字十六进制数字:
$newpwd = md5($_POST['newpw']);
使用没有salt的md5密码哈希是100%等于使用明文密码。即使加盐,它仍然非常不安全。备选方案:
问题本身在更新:
"UPDATE vartotojai SET pass='$newpwd' WHERE 'V_ID' = '{$_SESSION['user_id']}'"
应该是
"UPDATE vartotojai SET pass='" . $newpwd . "' WHERE V_ID = '" . $row["V_ID"] . "'"
使用您已选择的V_ID(我猜您已经拥有)比使用会话中的内容更安全。正常的单引号arround列告诉MySQL&#34;这不是一列&#34;。
答案 1 :(得分:-1)
试试这个
$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