我正在测试加密密码的不同方法,我使用了大多数方法,除了我对我正在使用的脚本的password_verify函数感到困惑以及如何在脚本中实现它(见下文)。此脚本涉及注册和登录等。脚本使用下面的代码行成功地将密码哈希。
$passwordhash = password_hash($p, PASSWORD_DEFAULT);
(来自注册)
但是当我尝试在我的登录脚本中使用密码验证时,它不起作用。所以我的问题是如何在下面的代码中使用password_verify函数。
<?php
//this is executed on another page
if(isset($_POST["e"])){
// Connect to db
include_once("databaseconnection.php");
//gather posted and sanitize
$e = mysqli_real_escape_string($db_conx, $_POST['e']);
$p = ($_POST['p']);
//user ip
$ip = preg_replace('#[^0-9.]#', '', getenv('REMOTE_ADDR'));
// FORM DATA ERROR HANDLING
if($e == "" || $p == ""){
echo "login_failed";
exit();
} else {
//data error handling end
$sql = "SELECT id, username, password FROM users WHERE email='$e' AND activated='1' LIMIT 1";
$query = mysqli_query($db_conx, $sql);
$row = mysqli_fetch_row($query);
$db_id = $row[0];
$db_username = $row[1];
$db_pass_str = $row[2];
if($p != $db_pass_str){
echo "login_failed";
exit();
} else {
//create session cookies
$_SESSION['userid'] = $db_id;
$_SESSION['username'] = $db_username;
$_SESSION['password'] = $db_pass_str;
setcookie("id", $db_id, strtotime( '+30 days' ), "/", "", "", TRUE);
setcookie("user", $db_username, strtotime( '+30 days' ), "/", "", "", TRUE);
setcookie("pass", $db_pass_str, strtotime( '+30 days' ), "/", "", "", TRUE);
//update certain fields ip, last login time
$sql = "UPDATE users SET ip='$ip', lastlogin=now() WHERE username='$db_username' LIMIT 1";
$query = mysqli_query($db_conx, $sql);
echo $db_username;
exit();
}
}
exit();
}
?>
(我试过,并且使用password_verify功能使用此代码失败了)
$p = password_verify( $_POST['p'], $passwordhash );
很抱歉,如果这很难理解,但如果有人可以提供帮助,我们将非常感激: - )
答案 0 :(得分:3)
假设您存储在数据库中的密码已经被散列,您遇到的问题是您无法验证密码,因为您要将纯文本密码与散列代码进行比较。
我相信改变
if($p != $db_pass_str){
echo "login_failed";
exit();
}
到
if(!password_verify($p, $db_pass_str)) {
echo "login_failed";
exit();
}
应该解决您的问题,请查看password_hash
和password_verify
答案 1 :(得分:0)
你有这个:
$ p =($ _POST [&#39; p&#39;]);
但在此之前没有做任何改变$ p的事情:
if($ p!= $ db_pass_str){
考虑什么是典型的,非典型的哈希是客户端和非典型的数据库以纯文本形式存储密码,所以我最好的猜测是表单传递一个未填充的密码和数据库正在存储哈希密码。除非您在登录表单中输入密码哈希,否则导致第二个引用行失败。
如果这不是问题,那么可能会发布一些额外的背景信息。