2017-04-22 92 views
-1

我正在爲我的博客製作一個登錄屏幕,但是當它檢查您在輸入字段中設置的密碼是否與數據庫中的散列密碼相同時,他說我的當它不是時,密碼是錯誤的。我的登錄腳本在驗證散列密碼時失敗

我已經搜索了很長時間,並問了幾個班的同學,但它仍然無法正常工作。

<form id="loginForm" method="post" action="?page=blogInput"> 
      <br><h1>LOGIN</h1> 

      <input type="text" placeholder="username" name="username" id="username" maxlength="24"><br> 
      <input type="password" placeholder="password" name="password" id="password" minlength="8" 
        maxlength="16"><br> 
      <input type="submit" value="login" id="submit"> 
     </form> 
    <?php 
include_once('resources/db.php'); 

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

$query = $dbh->prepare("SELECT username FROM users WHERE username=:username"); 
$query->execute(array(':username' => $username,)); 
$saved_password = $query->fetch(PDO::FETCH_ASSOC)['password']; 

if (isset($username, $password)){ 
    if (password_verify($password, $saved_password)){ 
     if ($query->rowCount() == 1){ 
      echo "<script language='javascript' type='text/javascript'> location.href='register.php' </script>"; 
     } 
     else{ 
      echo "<script type=\"text/javascript\">alert('Wrong username!')</script>"; 
     } 
    }else{ 
     echo "<script type=\"text/javascript\">alert('Wrong password or username!')</script>"; 
    } 

}else{ 
    echo "<script type=\"text/javascript\">alert('You need to fill in all fields')</script>"; 
} 

?> 

它被編輯爲最後的評論建議。

+1

您正在做PDO查詢的方式容易受到SQL注入的影響,請改用佔位符。 – Akar

+0

我看到一個'prepare()'調用,但是你從不'執行'()'語句。你應該在SQL中用參數':username'替換''用戶名'',並在嘗試獲取之前調用'$ query-> execute(array(':username'=> $ username))''。 –

+0

當你'echo $ saved_pa​​ssword'時,你會得到你期望的散列嗎? – Thakkie

回答

1

您的代碼會檢查$password兩次。首先在查詢中檢查密碼是否匹配。然後,它檢查密碼的散列是否匹配相同的值

只要從數據庫查詢中刪除and password=廢話,然後按照註釋中所述完成參數輸入更正。你應該沒問題。


...我只注意到...

SELECT username FROM ... 

您沒有選擇從數據庫的密碼(哈希)!

SELECT `password` FROM ... 
+0

這是你修補的東西嗎?我現在已收到警報,但仍未登錄 –

+0

OP正在進行編輯,現在他們的查詢根本沒有任何意義。編輯:它經歷了不少修訂http://stackoverflow.com/posts/43559298/revisions - 編輯#2:它現在已經經歷了又一次編輯。 –

+0

多數民衆贊成在很好的可能,但我不知道我必須這樣做,所以我做我理解你們都說我必須做的。 –