password_verify始终返回false,并且我无法在任何地方找到答案
密码验证始终返回false。我在这里看到了每个答案,但没有一个帮助。密码字段是varchar(255)。当我从数据库var_dump密码时,它显示字符串(60)并且密码正确,但该函数仍然返回false。 下面是存储在数据库中的代码:password_verify始终返回false,并且我无法在任何地方找到答案
if(empty($_POST['pass'])) {
$passErr = "Password required!";
$errors[] = "Pass error";
} else {
$pass = test_input($_POST["pass"]);
if(!preg_match("/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/", $pass)) {
$passErr = "Password not well formed";
$errors[] = "Pass error";
} else {
$pass_hashed = password_hash($pass, PASSWORD_DEFAULT);
}
}
$hash_ver = md5(rand(0, 1000));
$status = "";
$stm = $conn->prepare("INSERT INTO user VALUES(?, ?, ?, ?, ?, ?, ?, ?)");
$stm->bind_param("sssssssi", $id, $pass_hashed, $email, $fName, $lName, $hash_ver, $status, $id_role);
$stm->execute();
echo strlen($pass_hashed);
这是登录脚本的一部分
if(count($array) != 0) {
echo "<script>alert('Ima gresaka')</script>";
} else {
include('connectionFile/connection.php');
$stmt = $conn->prepare("SELECT `name`,`last_name`,`status_verif`,`email`,`password` FROM user WHERE `email`=?");
$stmt->bind_param("s", $email);
$stmt->execute();
if($res = $stmt->get_result()) {
$count = $res->num_rows;
if($count == 1) {
$row = $res->fetch_assoc();
$passwordb = $row['password'];
//echo "<p>".$passwordb."</p>";
$verify = password_verify($pass, $passwordb);
if($verify) {
echo "<script>alert('Password match')</script>";
} else {
var_dump($verify);
var_dump($passwordb);
echo "<script>alert('Password doesnt match')</script>";
}
} else {
echo "<script>alert('0 rows')</script>";
}
} else {
echo "<script>alert('No rows at all')</script>";
}
}
有两个可能原因。 :
-
1)
$pass = test_input($_POST["pass"]);
功能
test_input()
做一些事情的$_POST['pass']
字符串,不明就里的用户。此外,$pass
的值不在第二个代码块中声明。 -
2)
$stm = $conn->prepare("INSERT INTO user VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); $stm->bind_param("sssssssi", $id,$pass_hashed, $email,$fName,$lName, $hash_ver,$status, $id_role);
要插入未插入正确的SQL列,或者您从SQL提取值的值不正确的列,也许你提取和比较
md5
哈希你插入?
这将是有益的,如果你能证明一个例子输出,比如你在做什么var_dump
值状态。
在第二个代码块中如何设置$pass
以及test_input
在第一个代码块中实际做了什么也会非常有帮助。
代码的各个部分都可以改进。
此外,请仔细考虑您的逻辑结构 - 如果$pass
不适合您的preg_match
?它仍然会被插入到你的数据库中。您需要恰当地捕捉这些流量问题。
Read about how to display PHP error logs,或更好的是,dump them to a file to read in your IDE。
*“也许你正在提取和比较你插入的md5散列?”* - 这不是插入的内容。起初我是这么想的,但是他们插入了正确的变量。这MD5的东西看起来是为了别的东西。 –
@ Fred-ii-OP正在插入两个值,但由于我们不知道要插入哪些列,并且没有给出DB原理图,所以我认为这是一种选择,尽管公认不太可能。 – Martin
没错;完全未知的,以及为什么我没有为这个潜在的兔子洞发布答案的所有原因。祝你好运,让我知道你是否需要一个好的手电筒;-)编辑:我得跑。 –
我认为问题出在你的变量$行之后。它不会在登录脚本中识别$ passwordb = $ row ['password']。 尝试somerhing这样的:
// $rows = $res->fetch_assoc();
while(($row = $res->fetch_assoc()) !== FALSE) {
$rows[] = $row;
}
function returnArray($rows, $string)
{
foreach($rows as $row)
{
return $row[ $string ];
}
}
$passwordb = returnArray($rows, 'password');
//etc.........
感谢您抽出时间来解决我的问题,我设法找到的错误。问题在于$ pass变量。在包含连接文件后,$ pass变量没有返回我期望的结果,因为连接文件中存在另一个$ pass变量。再次感谢你,对不起,我还在学习如何正确使用StackOverflow。
你试过回应你的'$ pass'吗?它是否按预期得到了印刷品? –
这个方法做了什么'test_input()'?也许它是添加/嵌入你不知道的东西。 –
你也不应该以任何方式操纵密码,并可能是所有这些的原因。 –