2017-02-19 38 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只需在上/下箭头下点击一下即可变成绿色;这就是问题如何被解决/关闭的标记。 –