2014-10-29 94 views
0

好吧,作爲我的教育項目,我目前正在使用PHP和mysqli開發一個安全的登錄系統。這一切進行得很順利,但現在我遇到了一個問題,我的同齡人,老師和我都感到莫名其妙。更新字段驗證密碼?

我散列,並通過password_hash和password_verify檢查我的密碼。

當我創建一個賬戶,一切都被存儲在數據庫中正確。然後,當我嘗試登錄時,使用正確的密碼,它給我一個錯誤,我的密碼不是正確的。

現在,這裏的踢球:當我進入的phpMyAdmin,複製存儲在數據庫中的哈希密碼,並更新與excact複製密碼,密碼字段...它的工作原理。我可以按照預期登錄,使用我使用的密碼,並且不會給我任何錯誤。

有沒有人有一個想法,這是怎麼回事,如何解決?用於註冊

代碼:

public function createAccount() 
{ 
    global $con; 

    $this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n"; 
    $sql='INSERT into user (username, password, email, creation_date) 
     VALUES (?,?,?,?)'; 

    // Prepare statement 
    $stmt = $con->prepare($sql); 
    if($stmt === false) { 
     trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR); 
    } 

    // Bind parameters. Types: s = string, i = integer, d = double, b = blob 
    $stmt->bind_param('ssss',$this->username,$this->password,$this->email,$this->creationDate); 

    // Execute statement 
    $stmt->execute(); 

    echo $stmt->insert_id; 
    echo $stmt->affected_rows; 

    $stmt->close(); 

    $_SESSION['login'] = true; 
    $_SESSION['username'] = $username; 
    Header("Location: index.php"); 
} 

代碼用於驗證憑據:

public function fetchCredentials() { 
    // Select a set of credentials from the username given in form and return as array 
    global $con; 
    $sql = 'SELECT id, password FROM user WHERE username = ?'; 

    // Prepare statement 
    $stmt = $con->prepare($sql); 
    if($stmt === false) { 
     trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR); 
    } 

    // Bind parameters. Types: s = string, i = integer, d = double, b = blob 
    $stmt->bind_param('s',$this->username); 

    // Execute statement 
    $stmt->execute(); 

    // Store all results in an array 
    $rs=$stmt->get_result(); 
    $arr = $rs->fetch_all(MYSQLI_ASSOC); 
    $stmt->close(); 

    return($arr); 
} 

public function validateCredentials() { 
    // Get credentials 
    $arr = $this->fetchCredentials(); 

    // Validate username 
    if (count($arr) > 1) { 
     $this->error = 'crit'; 
     $this->abort = true; 
    } else if (count($arr) < 1) { 
     $this->error = 'badLogin'; 
     $this->abort = true; 
    } else { 
     $arr = $arr[0]; 
    } 

    echo $arr['password'].'<br>'.$this->password; 
    // Validate password. NOTE: This is where the issue arises. Password_verify() will return false where it should return true. 
    if ($this->abort == false && !password_verify($this->password, $arr['password'])) { 
     $this->error = 'badLogin'; 
     $this->abort = true; 
    } 

    // Return values if needed 
    if ($this->abort == false) { 
     $this->id = $arr['id']; 
    } 
    return $this->abort; 
} 

部分調用的日誌記錄:(是的,validatecredentials函數獲取調用兩次是的,有。在那裏,不是很好,寫了一些其他的東西。在這部分代碼還需要一些工作,這是上面的固定問題)

後,我會做的第一件事
+2

你認爲有人可以幫助你沒有一行代碼? – baao 2014-10-29 12:27:32

+1

請輸入驗證碼。但從哈希的經驗,不允許登錄正確確保您的數據庫表列設置爲文本或一些大數字這不會切斷散列 – Typhomism 2014-10-29 12:29:15

+0

您的帖子從一開始就糟糕開始...您使用mysqli而不是PDO。 ..你使用什麼類型的散列?還請提供代碼示例以瞭解您正在處理的事情! – 2014-10-29 12:33:38

回答

1

好的,對所有幫助過的人:謝謝。我剛剛得到同學的幫助,他設法找到了問題。我正在打我自己。

$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n"; 

這是它。 「\ n」。換行符。我從一個例子中獲得了我的代碼,並且出於某種原因出現在那裏。當我更新數據庫時,換行符被刪除。