2014-04-16 45 views
0

您能檢查我的代碼有什麼問題嗎?因爲它通過驗證,但不會更新我的舊密碼,我甚至嘗試在成功更新後回顯值,並在最後它返回我舊密碼,而不是新密碼。即使通過了所有驗證,也無法更新密碼

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

編輯:解決感謝桑卡達莫達倫。

+1

刪除V_ID中的引號 –

+1

嘗試回顯查詢並檢查是否有任何錯誤 – Jenz

+0

mysql擴展名已被棄用,使用PDO或mysqli因爲它們更加穩定和安全。 –

回答

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. 使用不含鹽的md5密碼散列與使用明文密碼的100%相同。即使用鹽,它仍然非常不安全。替代方案:

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

    https://github.com/ircmaxell/password_compat

問題本身就是在UPDATE:

"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「這不是一列」。

-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

+2

爲什麼你要爲用戶的id增加一個額外的變量? – DanFromGermany

+0

只要求...... +1爲'LIMIT 1' – DanFromGermany

+0

我不能使用mysqli或pdo因爲這是學習項目,我們需要使用mysql – djdanas