- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的注册脚本接受用户密码,然后使用 PHP 的 password_hash 函数对密码进行加密,然后将其放入数据库中。当我使用刚创建的用户登录时,出现检查密码是否相同的错误。就我而言,他们不是。我在登录脚本中调用 password_verify 函数时做错了什么?
注册
if($_SERVER["REQUEST_METHOD"] == "POST"){
function secure($data){
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return($data);
}
$p_num = secure($_POST["p_number"]);
$first_name = secure($_POST["first_name"]);
$last_name = secure($_POST["last_name"]);
$email = secure($_POST["email"]);
$password = secure($_POST["pw"]);
$verify_password = secure($_POST["pw_verify"]);
$program = secure($_POST["program"]);
$role = secure($_POST["role"]);
$logged_in = 0;
$registered = 0;
$image = "../images/profile_placeholder.png";
if($password != $verify_password){
echo "Nope. Passwords";
}
else{
$registered = 1;
$password = password_hash($password, PASSWORD_DEFAULT);
$insert = "INSERT INTO `$user_table`(`user_id`, `first_name`, `last_name`, `password`, `image`, `email`, `program`, `role`, `logged_in`, `registered`) VALUES('" .$p_num ."', '" .$first_name ."', '" .$last_name ."', '" .$password ."', '" .$image ."', '" .$email ."', '" .$program ."', '" .$role ."', '" .$logged_in ."', '" .$registered ."')";
$query = mysqli_query($connect, $insert);
echo "Success!";
}
}
登录
if($_SERVER["REQUEST_METHOD"] == "POST"){
$p_num = $_POST["username"];
$pwd = $_POST["password"];
$query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'";
$result = mysqli_query($connect, $query);
while($row = mysqli_fetch_assoc($result)){
$user_id = "{$row['user_id']}";
$first_name = "{$row['first_name']}";
$last_name = "{$row['last_name']}";
$user_name = $first_name ." " .$last_name;
$password = "{$row['password']}";
$image = "{$row['image']}";
$email = "{$row['email']}";
$program = "{$row['program']}";
$role = "{$row['role']}";
$status = "{$row['logged_in']}";
$registered = "{$row['registered']}";
if(($user_id == $p_num) && (password_verify($pwd, $password))){
$_SESSION["id"] = $user_id;
$_SESSION["user"] = $user_name;
$_SESSION["program"] = $program;
$_SESSION["pass"] = $password;
$_SESSION["image"] = $image;
$_SESSION["email"] = $email;
$_SESSION["role"] = $role;
$_SESSION["status"] = $status;
$_SESSION["registered"] = $registered;
$loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'";
}
var_dump($pwd);
var_dump($password);
}
这是我执行 var_dump 时得到的结果:
string(1) "1" string(16) "$2y$10$0aysCso3b"
很明显,密码没有匹配在一起。因此,在注册脚本中,密码被散列并发送到数据库。然后,当用户登录时,登录脚本会查看用户输入的登录密码,然后使用 password_verify 将其与数据库中的散列密码进行核对。然而,散列密码不接受未散列密码作为匹配项。我不明白的是,为什么?
最佳答案
这是我用于 password_hash
和 password_verify
的内容。按照编写的方式进行尝试,一旦成功,您就可以开始添加其余代码。
修改表名和列名以适应。
注意:这是一种基本的插入方法。我建议你使用 prepared statements相反。
旁注:密码列需要足够长以容纳散列 VARCHAR(255)
。请参阅“脚注”。
插入文件
<?php
$DB_HOST = 'xxx';
$DB_USER = 'xxx';
$DB_PASS = 'xxx';
$DB_NAME = 'xxx';
$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
die('Connection failed [' . $conn->connect_error . ']');
}
$password = "rasmuslerdorf";
$first_name = "john";
$password = password_hash($password, PASSWORD_DEFAULT);
$sql = "INSERT INTO users (`name`, `password`) VALUES ('" .$first_name ."', '" .$password ."')";
$query = mysqli_query($conn, $sql);
if($query)
{
echo "Success!";
}
else{
// echo "Error";
die('There was an error running the query [' . $conn->error . ']');
}
登录文件
<?php
// session_start();
$DB_HOST = 'xxx';
$DB_USER = 'xxx';
$DB_PASS = 'xxx';
$DB_NAME = 'xxx';
$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
die('Connection failed [' . $conn->connect_error . ']');
}
$pwd = "rasmuslerdorf";
$first_name = "john";
//$sql = "SELECT * FROM users WHERE id = 1";
$sql = "SELECT * FROM users WHERE name='$first_name'";
$result = $conn->query($sql);
if ($result->num_rows === 1) {
$row = $result->fetch_array(MYSQLI_ASSOC);
if (password_verify($pwd, $row['password'])) {
//Password matches, so create the session
// $_SESSION['user'] = $row['user_id'];
// header("Location: http://www.example.com/logged_in.php");
echo "Match";
}else{
echo "The username or password do not match";
}
}
mysqli_close($conn);
脚注:
密码列应该足够长以容纳散列。 72 长是散列产生的字符长度,但手册建议 255。
引用:
"Use the bcrypt algorithm (default as of PHP 5.5.0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP. For that reason, the length of the result from using this identifier can change over time. Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice)."
关于PHP password_hash(), password_verify(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26536293/
我的 Codeigniter(3.0 版)登录模块中有这个方法。它工作正常,但这安全吗?使用 PHP password_verify 检查登录名和密码是否有更好的解决方案?(PHP 5.6,MySQL
这个问题在这里已经有了答案: PHP password_verify not working against database (1 个回答) 关闭 5 年前。 这应该非常简单:我正在生成一个散列密
我的 Codeigniter(3.0 版)登录模块中有这个方法。它工作正常,但这安全吗?使用 PHP password_verify 检查登录名和密码是否有更好的解决方案?(PHP 5.6,MySQL
这个问题在这里已经有了答案: PHP password_verify not working against database (1 个回答) 关闭 5 年前。 这应该非常简单:我正在生成一个散列密
我正在尝试创建一个更安全的页面,我从密码加密部分开始。我正在尝试实现 password_hash + password verify,但到目前为止,我一直未能使整个工作正常进行。所以,它在我的登录区域
这里是登录代码,我试图让密码验证工作,但它不想。似乎这个 count($sql->fetchAll()) > 0 是问题所在,或者我调用了错误的变量给 password_verify()。 $
我使用 PHP 和 mySQLi 编写了简单的登录脚本。问题是 password_verify() 函数返回空变量。我已经仔细检查了所有内容,但我没有看到它。哪里有问题 ? session_start
我将用户名和加密密码存储在 mysql 数据库中。仅出于测试目的,我还将密码以未加密的形式存储在数据库中。 在下面的代码中,我从数据库中获取散列密码和未加密密码。然后我加密未加密的密码。 给定的密码未
好的,我已经在我的一个页面上使用了 password_hash。 我想知道如何将 password_verify 应用于以下代码: 函数 selectUser($conn, $username, $p
尝试从数据库验证散列密码,用户通过 POST 输入。经过一些简短的研究,这个问题似乎与无法将 mysqli_query 转换为字符串有关,尽管我不知道如何正确地做到这一点,因此我从另一个 SO 问题中
我一直在努力查找有关 password_verify() 是否使用长度常数时间比较来避免定时攻击的信息。 现在,简单的例子: $hash = '$2y$10$HH3906lfby7HOy1N3duQh
我通过 password_hash 散列我插入的密码。我使用 password_verify 验证它们。 然而,当我在我的数据库中插入一个散列密码并尝试验证它时,两个输出总是彼此不同。 我的页面如下,
函数password_verify()在新的 PHP 密码 API 中检查密码是否对应于哈希。哈希由 password_hash() 生成,默认情况下使用随机盐和 cost = 10。 我一直认为(尽
我已经为此挠头 2 个多小时了。我研究过关于 stackoverflow 的文章,包括: Issue with Bcrypt not verifying correctly php password_
我的注册脚本接受用户密码,然后使用 PHP 的 password_hash 函数对密码进行加密,然后将其放入数据库中。当我使用刚创建的用户登录时,出现检查密码是否相同的错误。就我而言,他们不是。我在登
我正在制作一个登录和注册系统。该系统可以正常工作,所以现在我必须为数据库存储的散列密码添加安全性。但是,当我从数据库中检索散列密码并将其与用户输入的密码进行比较时,它不起作用。 所以当我尝试
我正在尝试在某人登录我的网站之前检查他们的密码和用户名。密码都存储在 password_hash($password1, PASSWORD_BCRYPT); 我不确定我做错了什么。目前,无论我输入什么
我正在尝试做一个简单的登录操作,如果您可以调用的话。我正在使用MySQLi,到目前为止看起来还不错。 escape_string($myusername); $link->escape
这个问题在这里已经有了答案: php password_verify() hash and pass won't match (1 个回答) 关闭 5 年前。 $query = "SELECT *
我对这个主题进行了广泛的搜索,但没有人遇到过我能找到的相同问题。 我在 MySQL 表中创建一个用户,使用强度为 10 的 password_hash 的散列。 我一直在努力验证它,并制作了一个测试脚
我是一名优秀的程序员,十分优秀!