【发布时间】:2019-12-17 13:51:11
【问题描述】:
我目前正在试验 password_hash() 和 password_verify() 方法..
所以我坚持我要继续创建一个小登录/注册。
问题是每当我打开登录时,输出是:
失败
我不知道为什么。我已经将数据库中密码字段的长度设置为 255,但它仍然不起作用。
这是我的 register.php:
<?php
require_once('db.php');
$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);
$p = password_hash($_GET['password'], PASSWORD_DEFAULT);
$stmt = $db->prepare("INSERT INTO users (username, password) VALUES (?,?)");
$stmt->bind_param('ss', $username, $p);
$stmt->execute();
$stmt->close();
$db->close();
?>
我的登录信息如下所示:
<?php
session_start();
error_reporting(0);
require_once('db.php');
function e($input) {
return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}
$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);
$stmt = $db->prepare("SELECT username, password FROM users WHERE username = ?");
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->bind_result($username, $password);
$row = $stmt->fetch();
if (!empty($row)) {
if (password_verify($_GET['password'], $row['password'])) {
echo 'success';
}
else
{
echo 'failed';
}
}
else
{
echo "This user does not exist";
}
$stmt->close();
$db->close();
?>
我不知道如何让它工作:/
【问题讨论】:
-
在散列之前不必escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。
-
@JayBlanchard,我注意到了这一点,但后来注意到他们在比较中使用了
$_GET['password']。他们还将bind_result()用于这两个变量,然后使用来自$row的值来自fetch()。 -
在调试代码时,您真的不应该使用
error_reporting(0);,因为它会禁用所有警告、通知、错误等,从而使调试变得更加困难。 -
实际上,正如刚刚向我指出的那样,您并没有在任何地方使用转义的密码和用户名。您可以消除所有这些代码。
-
您需要养成accepting answers 的习惯,它可以帮助您解决问题。您将获得积分,并鼓励其他人帮助您。
标签: php mysqli prepared-statement password-hash