2016-03-20 108 views
1

我不知道爲什麼它不會工作。PHP登錄無效。使用password_verify,它似乎是導致一些問題

以上的login.php

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

$validEmail = filter_var($email, FILTER_VALIDATE_EMAIL); 

$getpassword = $connect->query("SELECT password FROM users WHERE email = '$validEmail'"); 
$row = $getpassword->fetch_assoc(); 

一切工作正常。我得到電子郵件所連接的密碼,以便我可以「驗證」密碼。

$passVarify = password_varify($password, $row['password']); 

當我嘗試 「回聲」,或使用 「的var_dump」/ 「的print_r」 上 「$ passVerify」,它只是顯示數字 「1」? 我驗證了密碼後,我運行了另一個查詢,以便可以獲得「用戶標識」和「特權」。我需要「解開」或再次將密碼設爲「正常」,以便我可以在下面進行查詢。

$result = $objConnection->query("SELECT userid, privileges FROM users WHERE email = '$validEmail' && password = '$passVarify'"); 

下面的代碼似乎沒有拿起查詢?由於某種原因,它不起作用。

if($result->num_rows > 0) { 

    $row = $result->fetch_assoc(); 

    $userid = $_SESSION['userid'] = $row['userid']; 
    $privileges = $_SESSION['privileges'] = $row['privileges']; 

} 

任何好主意?因爲我一直在撓撓我的腦後,試圖找出爲什麼第一個「查詢」起作用,而第二個不起作用?!

+1

'password_verify'返回true或false,沒有別的。如果您已經確認,則不需要使用WHERE clausel的密碼,確保一切正常。您可以不僅僅是將所需的所有列都提取到一列,並且如果證書正確並且打印錯誤和/或重定向,則設置您需要的內容。 –

+1

您正在使用'password_hash/verify':很好。您正在將用戶提供的值注入到SQL查詢中:bad ... –

回答

1

你讓自己難過。

首先,password_verify()的結果爲TRUE或FALSE,即已驗證或未驗證。它不會取消密碼。沒有什麼能夠解決散列問題。

另外你不需要做2個獨立的調用來從你的數據庫中獲取數據。

您也不需要將POST數組中的電子郵件地址複製到標量變量中。

因此,這將是你的代碼

而且你並不真的需要過濾用戶輸入密碼的簡單流程。如果不對,verify_password()將會失敗,這就是你所需要知道的。

$result = $connect->query("SELECT userid, privilages, password 
          FROM users 
          WHERE email = '{$_POST['email']}'"); 

$user = $result->fetch_assoc(); 

if (! password_verify($_POST['password'], $user['password'])) { 
    // show the password error screen 
    exit; 
} else { 
    // save all the SELECTED user info into a sub array of SESSION 
    // to be used later 
    $_SESSION['user'] = $user; 
} 

你確實應該使用參數化查詢,而不是注入POST變量到查詢。

$stmt= $connect->query("SELECT userid, privilages, password 
          FROM users 
          WHERE email = ?"); 

$stmt->bind_param("s", $_POST['email']); 
$stmt->execute(); 

$result = $stmt->get_result(); 
$user = $result->fetch_array(MYSQLI_ASSOC); 
+0

謝謝:)我知道有很多事情我應該/可以做得更好,但是我很長時間沒有成爲程序員。所以現在,我正在做我多年前做的事情。我想學習PDO和OOP,因爲我聽過和讀過的,它應該是一個「更簡單」,更好的方法?如果我錯了,請糾正我。再次感謝。 – Simon

+0

你沒有錯。但是看起來你現在的代碼使用的是MYSQLI而不是PDO – RiggsFolly