2012-12-08 129 views
0

我正在創建一個用戶表單和表單操作,其中用戶(已登錄使用會話變量)可以更改他們的MD5(我知道MD5已過時和不安全,這是出於測試目的)加密的帳戶密碼存儲在sql數據庫的用戶表中。更新用戶md5密碼在sql表中使用用戶更改密碼錶格

我有一個表單,要求輸入'當前密碼','newpassword'和'confirmnewpassword'。表單使用$ _POST將輸入的數據傳遞給passwordaction.php。

用戶名是從$ _SESSION'autheticatedUser'獲得的,並且密碼是從前面的$ _POST表單變量中獲取的。然後,我使用sql語句從數據庫獲取密碼以與'currentpassword'變量進行比較,將此計數作爲INSECURE客戶端側驗證? ?

然後,我有一個SQL UPDATE語句來更新數據庫中指定用戶的密碼行,並且用戶使用$ _SESSION頭重定向和通知成功或失敗。

我一直在閱讀和重新閱讀我的代碼,試圖找出何時出現錯誤,因爲當試圖更改用戶帳戶密碼我不斷返回到我的登錄頁面(使用$ SESSION標頭)告訴我它已經但是當我檢查數據庫時密碼沒有更新。

我希望有人elses觀點或觀點可能能夠幫助我看看什麼是錯過的,任何人都可以提出爲什麼我的SQL UPDATE語句不工作?

任何建設性的批評,歡迎在下面

是我的 '動作' PHP頁面

<?php 

session_start(); 

$username = $_SESSION["authenticatedUser"]; 
$currentpassword = md5($_POST['currentpassword']); 
$newpassword = md5($_POST['newpassword']); 
$confirmnewpassword = md5($POST['confirmnewpassword']); 

/* make a connection with database */ 
$con = mysql_connect("localhost", "root", "") or die(mysql_error()); 

/* select the database */ 
mysql_select_db("groupproject") or die(mysql_error()); 

$queryget = mysql_query("SELECT password FROM users WHERE username='$username'") or 
die(mysql_error()); 
$row = mysql_fetch_assoc($queryget); 
$currentpasswordDB = $row['password']; 

//check passwords 

if ($currentpassword==$currentpasswordDB) 

{ 
if ($newpassword==$confirmnewpassword) 
{ 
//success, change password in DB 
    $querychange = mysql_query("UPDATE users SET password='$newpassword' WHERE  
username='$username'") or die(mysql_error()); 
} 
else header("Location: passwordmismatch.php"); 

if ($querychange == true){ 

    $_SESSION["passchange"] = "Your password has been changed, Please Log in"; 

    header("Location:login.php"); 

} 

else $_SESSION["nopasschange"] = "Your password could not be changed, Please try 
again"; 
header("Location:userchangepassword.php"); 

} 

else header("Location: passwordmismatch.php"); 

mysql_close($con); 

?> 
+2

您正在使用[an **過時的**數據庫API](http://stackoverflow.com/q/12859942/19068),並應使用[現代替換](http://php.net/manual/) EN/mysqlinfo.api.choosing.php)。你也**易受[SQL注入攻擊](http://bobby-tables.com/)**,現代的API會使[防禦]更容易(http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php)自己從。 – Quentin

+1

MD5 [不適合密碼散列](http://php.net/manual/en/faq.passwords.php#faq.passwords.fasthash),另請參閱[密碼存儲備忘錄](https:// www .owasp.org/index.php的/ Password_Storage_Cheat_Sheet)。 – Quentin

+0

這兩個意見是有益的謝謝你,但是這個項目永遠不會成爲一個活的網站。我會牢記MD5並不是最佳的散列工具 –

回答

1

$user$username是不同的變量碼。

+0

,但我發現這個問題仍然沒有解決問題 –

0

位晚:P

但該行中 $ confirmnewpassword = MD5($ POST [ 'confirmnewpassword']);

它應該是

$ confirmnewpassword = MD5($ _ POST [ 'confirmnewpassword']);