无法使用 password_verify($password, $hash)
Unable to use password_verify($password, $hash)
所以我有一个注册页面和一个登录页面,注册页面工作得很好,但登录页面似乎不起作用,我似乎无法弄清楚。
我的数据库似乎可以正常工作,因为我能够将散列密码回显到登录页面上,这似乎与
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;
}
}
这里的问题是 \n
in:
$h_p = password_hash($pass, PASSWORD_DEFAULT, $options)."\n";
^^
是(invisibly)在你的password/hash.
的末尾添加一个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()
上的手册没有提及它以及将其存储在数据库(或文件)中的用法。
注意:文档在这里没有使用的是分配一个variable 到示例,这是这里问题中所做的。有些人可能认为使用该示例并为其分配一个变量会起作用; 不会;不是为了存储散列然后在之后验证它。
手册中的示例如下:
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
但是正在做:
$var = password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
实际上(理论上)将包含一个 61 长度的字符串(因为连接的换行符),而不是没有换行符的预期 60。
- 所以现在您需要清除当前的哈希值并使用一组新的哈希值重新开始。
当运行时,会输出这样的东西:
y4GPYzaynEkfYxE3wcAj.OtwBU3CCwTMXOHKbdJmOqwMXRmq6v1u
61
以防万一 URL 稍后出现 404,这是上面的代码:
<?php
$foo = password_hash('mypass', PASSWORD_DEFAULT)."\n";
echo $foo;
echo strlen($foo);
补充说明;您还应该像为 INSERT
所做的那样为您的 SELECT
使用准备好的语句;安全多了。
所以我有一个注册页面和一个登录页面,注册页面工作得很好,但登录页面似乎不起作用,我似乎无法弄清楚。
我的数据库似乎可以正常工作,因为我能够将散列密码回显到登录页面上,这似乎与 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;
}
}
这里的问题是 \n
in:
$h_p = password_hash($pass, PASSWORD_DEFAULT, $options)."\n";
^^
是(invisibly)在你的password/hash.
的末尾添加一个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()
上的手册没有提及它以及将其存储在数据库(或文件)中的用法。
注意:文档在这里没有使用的是分配一个variable 到示例,这是这里问题中所做的。有些人可能认为使用该示例并为其分配一个变量会起作用; 不会;不是为了存储散列然后在之后验证它。
手册中的示例如下:
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
但是正在做:
$var = password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";
实际上(理论上)将包含一个 61 长度的字符串(因为连接的换行符),而不是没有换行符的预期 60。
- 所以现在您需要清除当前的哈希值并使用一组新的哈希值重新开始。
当运行时,会输出这样的东西:
y4GPYzaynEkfYxE3wcAj.OtwBU3CCwTMXOHKbdJmOqwMXRmq6v1u 61
以防万一 URL 稍后出现 404,这是上面的代码:
<?php
$foo = password_hash('mypass', PASSWORD_DEFAULT)."\n";
echo $foo;
echo strlen($foo);
补充说明;您还应该像为 INSERT
所做的那样为您的 SELECT
使用准备好的语句;安全多了。