2017-02-19 35 views
3

所以我有一個註冊頁面和一個登錄頁面,註冊頁面工作得很好,但登錄頁面似乎無法工作,我似乎無法弄清楚。

我的數據庫似乎是工作,因爲我能夠呼應出哈希密碼在登錄的頁面,似乎有事情做與 password_verify()

註冊頁面(工作)

<?php 
include("assets/includes/conn.php"); 

$user = $_POST['username']; 
$pass = $_POST['pass']; 
$cPass = $_POST['c-pass']; 
$email = $_POST['email']; 

$options = [ 
    'cost' => 11 
]; 

if($pass == $cPass){ 

    $stmt = $conn->prepare("INSERT INTO users (username, pass, email) VALUES (?, ?, ?)"); 
    $stmt->bind_param("sss", $user, $h_p, $email); 

    $user = $_POST['username']; 
    $h_p = password_hash($pass, PASSWORD_DEFAULT, $options)."\n"; 
    $email = $_POST['email']; 
    $stmt->execute(); 

    echo "Created"; 
    echo $h_p; 
    $stmt->close(); 
    $conn->close(); 

} 

登錄頁面(不工作)

<?php 
include("assets/includes/conn.php"); 

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

$sql = "SELECT * FROM users WHERE username = '$username'"; 
$result = $conn->query($sql); 

if ($result->num_rows == 1){ 
    $row = $result->fetch_assoc(); 
    $hash = $row['pass']; 

    if(password_verify($password, $hash)){ 
     echo "Yes"; 
    } else { 
     echo "No<br/>"; 
     echo "" . $hash . "<br/>"; 
     echo $password; 

    } 
} 
+0

我有一些想法,爲什麼它失敗,但你可以看到下面的答案。 –

+0

確保你[顯示錯誤](http://stackoverflow.com/questions/1053424/how-do-i-get-php-errors-to-display),以防萬一你的變量沒有正確發送腳本等 – Mike

+0

@Mike問題是我不認爲這是一個錯誤,它只是告訴我,密碼是不正確的,即使它是,這可能與它被哈希 –

回答

8

這裏的問題是,在\n

$h_p = password_hash($pass, PASSWORD_DEFAULT, $options)."\n"; 
                 ^^ 

是(無形)在您的密碼/哈希的末尾添加一個carriage return/linefeed

您可以將其刪除。

$h_p = password_hash($pass, PASSWORD_DEFAULT, $options); 

trim()它:

$h_p = password_hash($pass, PASSWORD_DEFAULT, $options)."\n"; 
$h_p = trim($h_p); 

我真的不知道爲什麼password_hash()手冊沒有做關於它的記載和它存儲在數據庫中的使用(或一份文件)。

注:什麼文檔沒有使用這裏,是分配一個變量的例子,這是在這個問題做了這裏。有些人可能會認爲使用該示例併爲其分配變量將起作用; 它不會;不是用於存儲散列,然後再驗證它。

從手動的示例讀取爲:

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n"; 

但是這樣做:

$var = password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n"; 

實際上將(理論上)含有61長度的字符串(因爲concated換行字符的),而不是沒有換行字符的預期的60。

  • 所以,現在你需要清除你現在的哈希,並重新開始一組新的哈希。

看一看this sandbox code example

運行時,它會輸出是這樣的:

 
$2y$10$494GPYzaynEkfYxE3wcAj.OtwBU3CCwTMXOHKbdJmOqwMXRmq6v1u 
61 

就在案件的網址是404以後,下面是上面的代碼:

<?php 
$foo = password_hash('mypass', PASSWORD_DEFAULT)."\n"; 
echo $foo; 
echo strlen($foo); 

在附加說明中;您也應該像使用INSERT一樣,爲您的SELECT使用準備好的聲明;它更安全。

+0

非常感謝,它的工作原理! –

+0

@TristanSchlarman不客氣。我昨晚在這個問題上,但不得不去睡覺。然後,我今天再次回答這個問題,以添加我的答案。它現在可以被標記爲已解決。 –

+0

@TristanSchlarman只需在上/下箭頭下點擊一下即可變成綠色;這就是問題如何被解決/關閉的標記。 –