2015-10-15 37 views
1

我目前是第3年的網絡開發學生,對於學校項目,我們必須使用PDO和哈希來創建具有更改密碼功能的網站,但是我遇到了一個我自己無法解決的問題,我也沒有在google和stackoverflow上發現任何類似的問題。PHP不能在PDO查詢中使用散列密碼

我們必須在數據庫中存儲2個密碼,舊密碼(這是用戶最後使用的密碼);和他們的當前密碼(這將被用來登錄。)

所有密碼的存儲與一個標準的PHP哈希(在password_hash()方法)

當改變用戶的密碼,我必須得到當前密碼(用於登錄的密碼),並將新散列密碼放入數據庫時​​將其移至舊密碼(最後使用的密碼)列。

問題是:我似乎無法在PDO查詢使用散列密碼,我需要指出的是,我從來沒有與PDO工作過,但谷歌上搜索了一下後,我不認爲我的查詢中有一個錯誤,但在傳遞給該查詢的數據中。

這是我從數據庫

/*prepare and execute a query*/ 
$sqlStatement = $this->db->prepare("SELECT username, password, oldpassword FROM users WHERE username = :username"); 
$sqlStatement->bindParam(":username", $username, PDO::PARAM_STR); 
$sqlStatement->execute(); 

/*Fetch the query results*/ 
$values = $sqlStatement->fetch(PDO::FETCH_ASSOC); 

得到所有的當前數據而這正是我嘗試使用PDO SQL查詢

/*Create variables to use in querys*/ 
$queryPassword = password_hash($password, PASSWORD_DEFAULT); 

/*Update the passwords*/ 
$sqlStatement2 = $this->db->prepare("UPDATE password, oldPassword VALUES (:password, :oldpassword)"); 
$sqlStatement2->bindParam(":password", $queryPassword, PDO::PARAM_STR); 
$sqlStatement2->bindParam(":oldpassword", $values["password"] , PDO::PARAM_STR); 
$sqlStatement2->execute(); 

$密碼來存儲數據到數據庫和$ username是從窗體傳遞的變量,到更改用戶密碼的函數。

public function updateUserPasswords($username, $password){ 

我感到奇怪的是:如果我做的var_dump在$值[ 「密碼」]我得到以下數據:
字符串(60) 「$ 2Y $ 10 $ BBCpJxgPa8K.iw9ZporxzuW2Lt478RPUV/JFvKRHKzJhIwGhd1tpa」

我在哪裏查詢錯誤,給了我下面的數據:
$ 2Y $ 10 $

就好像只哈希被髮送到查詢。

== ==編輯

SQL錯誤發送到瀏覽器:

Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALUES ('$2y$10$AC.aMG/gNV9zwGB/v/g7keW9jsZ80kuejrSh693DPuhOYChFxA6wu', '$2y$10$' at line 1' in /srv/jip/www/www.jip.nl/classes/user.class.php:92 Stack trace: #0 /srv/jip/www/www.jip.nl/classes/user.class.php(92): PDOStatement->execute() #1 /srv/jip/www/www.jip.nl/pages/first_login.php(26): User->updateUserPasswords('username', 'password') #2 {main} thrown in /srv/jip/www/www.jip.nl/classes/user.class.php on line 92 
+0

你爲什麼使用散列字符串作爲輸入?你只需要傳遞原始密碼,並在MYSQL端進行加密。你的var轉儲也很好。 –

+0

@ noobie-php你能解釋一下你的評論嗎?我在OP代碼中看不到有關密碼政策的任何問題。 –

+1

你正在更新你的表中的所有tehe密碼 –

回答

6

不要使用檢索哈希密碼數據,因爲password_hash()生成一個新的哈希只要與它的使用

檢索只使用用戶名的記錄不同的鹽,然後用password_verify()以驗證密碼

編輯

您更新查詢引用列,但沒有桌子,沒有一個WHERE子句:

$sqlStatement2 = $this->db->prepare("UPDATE users SET password=:password, oldPassword=:oldpassword WHERE username = :username"); 
$sqlStatement2->bindParam(":password", $queryPassword, PDO::PARAM_STR); 
$sqlStatement2->bindParam(":oldpassword", $values["password"] , PDO::PARAM_STR); 
$sqlStatement2->bindParam(":username", $username, PDO::PARAM_STR); 
$sqlStatement2->execute(); 

用適當的值

+0

好的,謝謝你的快速響應,我會試一試,當我這樣做的時候檢查一下。 – Jip

+0

很好解釋和相當邏輯 –

+0

where子句確實缺少,還沒有添加它,因爲該表目前只有一個測試結果.. 至於表,它包含在** $ this-> db **中 – Jip

1

原來我的查詢確實是不正確綁定,自從我上次進行更新查詢並且將它與插入查詢的格式相同以來,這已經有一段時間了。

Mark Ba​​ker的解決方案也解決了從數據庫中檢索舊密碼的問題。只使用用戶名檢索信息已經奏效。