我认为我的问题是环境问题,但我已经找到了我能想到的一切来找到它。代码在3周前工作正常,几天前突然停止了。我还没有在那段时间内更新O / S或PHP。
我使用password_hash从$ _POST变量创建密码,然后将其写入MySQL数据库字段(设置为varchar(255))。出现问题后,我在写入数据库之前添加了测试代码,对内存中的变量执行password_verify,然后在写入数据库后重新读取数据库中的值。在这两种情况下,它都作为匹配返回。但是,尝试运行password_verify的任何其他页面都会返回不匹配的状态。我已经捕获了初始哈希并在视觉上将其与数据库中的值进行了比较,它们是相同的。两个服务器(生成哈希的服务器和在用户登录时读取它的服务器都运行相同版本的php(5.6.9-0 + deb8u1)。
这是我的完整代码,其中包含当前的调试状态。在下面的代码中,使用PASSWORD_DEFAULT的注释掉的行是我最初使用的。我试过BCRYPT选项只是为了看它是否会解决它。我还尝试将$ _POST ['密码']放入变量中,而不是直接调用它,并在其周围包裹修剪。一切似乎都没问题,直到我离开这个页面并尝试从另一页。我还检查了网上其他帖子中讨论的内容。
//USER DOES NOT EXIST
mysqli_close($con);
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
$error = true;
}
// New user - add them to database
echo "Creating your account. <br>";
$pwd = $_POST['password'];
//$password = password_hash(trim($_POST['password']), PASSWORD_DEFAULT);
$password = password_hash($pwd, PASSWORD_BCRYPT);
echo $password . '<br>';
$sel = 'CALL sp_add_user("'. $_POST['firstname'] . '","'. $_POST['lastname'] . '","'. $_POST['email1'] .
'","'. $_POST['city'] . '","'. $_POST['country'] . '","'. $password . '","'. $timestamp . '")';
$con=mysqli_connect($conip,$dbuser,$dbpw,$mgrdb);
if(!mysqli_query($con, $sel))
{
echo("Error description: " . mysqli_error($con));
}
else{
mysqli_close($con);
//verify the password in the DB is good
$sel='CALL sp_get_pwd("' . $_POST['email1'] . '")';
//echo $sel;
$con=mysqli_connect($conip,$dbuser,$dbpw,$mgrdb);
$result = mysqli_query($con, $sel);
if (mysqli_num_rows($result)>0){
while($row = mysqli_fetch_array($result)) {
$dbpwd = $row['password'];
}
}
echo $dbpwd . '<br>';
if(password_verify(trim($_POST['password']), $dbpwd)){echo 'Match<br>'; } else { echo 'Match failed<br> ';}
mysqli_close($con);
答案 0 :(得分:0)
我没有数据库和表单提取模拟你的代码,它运行正常。这意味着您的数据库或POST字段存在问题。
Creating your account.
$2y$10$iw6fSApO7Ok0ySZ.OsQqbe.DpVrvzJ86ZYIsWYg5060hyXbBYEiee
$2y$10$iw6fSApO7Ok0ySZ.OsQqbe.DpVrvzJ86ZYIsWYg5060hyXbBYEiee
Match
输出:
var_dump
在插入之前使用散列$password
var 上的$dbpwd
,然后再使用<{1>} 之后的<{strong>>再次使用SELECT并查看如果你弄错了另外,检查PHP项目脚本和数据库模式是否存在冲突的字符集定义。