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)
之前,但正如我所說,我不知道。
你不能像這樣從數據庫中選擇密碼。在select語句中,您試圖將純文本密碼與散列進行比較。 – Devon
看到你的另一個問題http://stackoverflow.com/q/39781691/你在哪裏使用md5來存儲密碼哈希值,我打賭你的密碼列不夠長。如果它<60,那麼它在這裏默默無聞。如果是這樣,你必須重新開始新的保存哈希。我對這個「答案」(相當)有信心。保存的散列btw的長度和長度(包括密碼列的長度)的值是什麼? –
在我回答上一個問題後,我已經抓住機會,將長度改爲150,所以不能這樣。 @ Fred-ii- – Synyster