即使所有验证都通过,也无法更新密码

时间:2014-04-16 10:27:26

标签: php mysql

你能查看我的代码有什么问题吗?因为它通过了验证,但没有用新的密码更新我的旧密码...我甚至尝试在成功更新后回显值,最后它返回我的旧密码而不是新密码。

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

2 个答案:

答案 0 :(得分:1)

$newpwd = mysql_real_escape_string(md5($_POST['newpw']));

由于以下几个原因,这一行中的方法完全错误:

  1. 由于转义,您允许多个密码匹配相同的哈希。因此,订单是错误的,应该是:

    $newpwd = mysql_real_escape_string(md5($_POST['newpw']));

  2. 更进一步,您甚至不需要转义md5哈希,因为它只包含字母数字十六进制数字:

    $newpwd = md5($_POST['newpw']);

  3. 使用没有salt的md5密码哈希是100%等于使用明文密码。即使加盐,它仍然非常不安全。备选方案:

    http://php.net/function.password-hash

    https://github.com/ircmaxell/password_compat

  4. 问题本身在更新:

    "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