我想用密码验证登录系统。我已经用默认密码加密了我的密码。我还将散列存储在数据库中。现在我想使用passwordverify来创建一个登录系统,但是函数总是返回一个值true。有人能解释为什么吗?有人能给我解释一下如何用$\u post验证密码吗?
哈希的代码
<?php
/**
* Created by PhpStorm.
* User: jbosma
* Date: 24/07/2018
* Time: 23:21
*/
include_once "dbconnection.php";
if (isset($_POST["submit"])) { // send the input
$username = $_POST["username"]; // post the input username
$password = $_POST["password"]; // post the input password
$conn = new PDO("mysql:host=localhost;dbname=loginapp", $user, $pass); // database connection
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // error mode
$hash = PASSWORD_HASH($password, PASSWORD_DEFAULT); // make $hash so you can give that to your password in the query
$sql = "INSERT INTO users (username, password) VALUES ('".$username."','".$hash."')"; // insert the username and the password that will be hashed
$conn->exec($sql); // excecute the query above
header('location: register.php'); // after you submit it redirects to login.php
}
密码验证代码
<?php
/**
* Created by PhpStorm.
* User: jbosma
* Date: 27/07/2018
* Time: 12:11
*/
include_once "dbconnection.php";
if (isset($_POST["submit"])) { // send the input
$username = $_POST["username"]; // post the input username
$password = $_POST["password"]; // post the input password
$hash = $password; // hash from password
if (password_verify($_POST["password"], $hash)) {
echo "Welcome";
} else {
echo "Wrong Password";
}
}
?>
2条答案
按热度按时间hof1towb1#
在您的reg表单中有这样的内容,它在这个示例中使用bcrypt。这只是显示密码\u散列函数
登记
登录
这只是展示如何使用函数本身,应用这个原则,你应该很好去
kxkpmulp2#
问题
你的
password_verify
始终返回true
因为,通过使用password_verify($_POST["password"], $hash)
,你实际上是在比较$_POST["password"]
自$hash = $password
以及$password = $_POST["password"]
.解决方案
这个
password_verify
应该比较发布的密码($_POST["password"]
)首先,必须从数据库中提取密码散列。因此,您的登录代码应该如下所示:请注意,此解决方案对sql注入开放。改用准备好的语句(参见下面的扩展示例)。
另一个扩展示例:
下面是另一个使用
password_hash - password_verify
串联。尽管我同意@tadman:您应该使用外部库(作为您所希望的框架的一部分提供,或者作为独立组件提供)来提供一个可靠的安全层。注意,避免所谓的sql注入,更具体地说,确保安全的身份验证/授权系统的第一个重要步骤是使用准备好的语句。在使用数据访问层时,请尝试始终应用此准备步骤。
单文件
登录.php
连接.php
欢迎.html
表定义
请注意
password
列。这个领域应该(至少)这么长。更多详细信息请参见密码散列(在“说明”中)。