使用password_hash()和password_verify()

时间:2016-01-09 06:18:35

标签: php mysql

所以我在这里碰到了一堵砖墙,我似乎无法弄清楚我做错了什么。我到处寻找并尝试实施所有答案,但无济于事!我很确定它与SQL数据库的输入有关,但我不确定它是什么。

首先,这是从表单向数据库输入用户密码的代码。我和所有这些相当新,但我知道SQL注入(http://php.net/manual/en/security.database.sql-injection.php),并且正计划在我使用此密码时解决这些问题,现在是4小时之后。这是数据库输入代码:

$user_id = mysqli_real_escape_string($mysqli,$_POST['user_id']);
$getpassword = mysqli_real_escape_string($mysqli,$_POST['password']);
$password = password_hash($getpassword, PASSWORD_DEFAULT);
$sql = "INSERT INTO `members` (`user_id`, `password`) VALUES ('$user_id', '$password')";
    $insertRow = mysqli_query($mysqli, $sql);
    if($insertRow){
print 'Success! ID of last inserted record is : ' .$mysqli->insert_id .'<br />';
}else{
    die('Error : ('. $mysqli->errno .') '. $mysqli->error);
}

将其输入数据库没问题。数据库的密码字段是带有utf8_unicode_ci编码的VARCHAR(225)。

在我的登录页面(也是index.php)下面是验证输入密码的代码:

if(isset($_POST['login']))
{
 $username = mysqli_real_escape_string($mysqli, $_POST['username']);
 $password = mysqli_real_escape_string($mysqli, $_POST['password']);
 $res=mysqli_query($mysqli, "SELECT * FROM members WHERE user_id= '$username'");
 $row=mysqli_fetch_assoc($res);
 $hash = $row['password'];
 $verified = password_verify($password, $hash);
 if($verified)
 {
  $_SESSION['user'] = $row["user_id"];
   echo "Verification succeeded";
 } else 
 {
echo "Verification Failed";
 } 
}

似乎无论我尝试什么,它总是返回“验证失败”。当我剪切并粘贴已输入数据库的散列密码,并运行像这样的代码

$verified = password_verify($password, '$2y$10$QxFTdQZT7J2LqulNsRUWPO2LxBS5hmS3NeqLtEtQMEhtbIjoj6LNa'); 

它仍然会返回“Verification Failed”,这让我怀疑这与我放入数据库时​​发生的事情有关。

我检查了所有这些链接,但似乎我必须做一些完全不同的事情(而且很可能是完全愚蠢和明显的):

php password_hash and password_verify looked all over still doesn't work

php password_verify not working with database

php password_verify not working

password_verify php not match

http://forums.phpfreaks.com/topic/283407-need-help-with-password-verify/

无论如何,它正在努力,希望有人可以看到我所犯的明显错误。

干杯

1 个答案:

答案 0 :(得分:0)

@jbafford谢谢!你完全正确,问题代码在我发送信息的表单中。我从来没有把它拿起来,因为当我回显每个结果以查看代码是否从表单中接收它们时,密码总是显示为哈希实体,所以我觉得一切都很好。这是问题代码:

<input type="password" class="form-control" id="password" required="required" placeholder="Enter Password">

无论出于何种愚蠢的原因,我都会使用&#39; id&#39;而不是&#39; name&#39;。修正了这个

<input type="password" class="form-control" name="password" required="required" placeholder="Enter Password">

一切都很好!感谢大家的帮助,现在我可以继续这件事了!