2016-09-30 42 views
0

我無法使其工作。我是新來的準備好的陳述,所以我有點在50/50我在做什麼。使用預處理語句獲取散列密碼

登記時,密碼散列與password_hash($pass,PASSWORD_DEFAULT)

現在,我試圖讓我的登錄頁面與此有關的功能,但我不知道在哪裏/如何將它與password_verify()

$username = $_POST['username']; 
     $password = $_POST['password']; 

     $sql = "SELECT * FROM users WHERE BINARY username=? AND password=?"; 
      $stmt = $db->prepare($sql); 
       $stmt->bind_param("ss",$username,$password); 
       $stmt->execute(); 
       $result = $stmt->get_result(); 
       $num_rows = $result->num_rows; 

       if($num_rows == 1){ 

        $rows = $result->fetch_assoc(); 
        if(password_verify($password, $rows['password'])){ 
        $_SESSION['loggedin'] = $username; 
        $_SESSION['country'] = $rows['country']; 
        $_SESSION['email'] = $rows['email']; 
        $_SESSION['avatar'] = $rows['u_avatar']; 
        $_SESSION['is_gm'] = $rows['is_gm']; 
        $_SESSION['user_lvl'] = $rows['user_lvl']; 
        $_SESSION['totalposts'] = $rows['post_total']; 
        $_SESSION['totalcoins'] = $rows['coins_total']; 
        $_SESSION['totalvotes'] = $rows['vote_total']; 
        $_SESSION['secquest'] = $rows['sec_quest']; 
        $_SESSION['secanswer'] = $rows['sec_answer']; 
        $_SESSION['join_date'] = $rows['join_date']; 

        header("Location: /index.php"); 
        exit(); 
        } 
       } else { 
        echo "<p class='error_msg'>No accounts could be found with the given credentials.</p>"; 
       } 

       $stmt->free_result(); 
       $stmt->close(); 
       $db->close(); 

我假設密碼驗證會在if($num_rows == 1)之前,但正如我所說,我不知道。

+0

你不能像這樣從數據庫中選擇密碼。在select語句中,您試圖將純文本密碼與散列進行比較。 – Devon

+0

看到你的另一個問題http://stackoverflow.com/q/39781691/你在哪裏使用md5來存儲密碼哈希值,我打賭你的密碼列不夠長。如果它<60,那麼它在這裏默默無聞。如果是這樣,你必須重新開始新的保存哈希。我對這個「答案」(相當)有信心。保存的散列btw的長度和長度(包括密碼列的長度)的值是什麼? –

+0

在我回答上一個問題後,我已經抓住機會,將長度改爲150,所以不能這樣。 @ Fred-ii- – Synyster

回答

1

您的查詢基本上是:

SELECT * FROM users WHERE username=username AND password_hash=plain_text_password 

這是行不通的。如果您依賴PHP密碼散列,則無法在SQL級別上進行密碼比較。從數據庫中檢索密碼散列,然後在WHERE參數中執行password_verify(排除密碼=?)。