2017-07-25 36 views
0

密码验证始终返回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>"; 
    } 

} 
+0

你试过回应你的'$ pass'吗?它是否按预期得到了印刷品? –

+1

这个方法做了什么'test_input()'?也许它是添加/嵌入你不知道的东西。 –

+0

你也不应该以任何方式操纵密码,并可能是所有这些的原因。 –

回答

0

两个可能原因。 :

  • 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

+0

*“也许你正在提取和比较你插入的md5散列?”* - 这不是插入的内容。起初我是这么想的,但是他们插入了正确的变量。这MD5的东西看起来是为了别的东西。 –

+0

@ Fred-ii-OP正在插入两个值,但由于我们不知道要插入哪些列,并且没有给出DB原理图,所以我认为这是一种选择,尽管公认不太可能。 – Martin

+0

没错;完全未知的,以及为什么我没有为这个潜在的兔子洞发布答案的所有原因。祝你好运,让我知道你是否需要一个好的手电筒;-)编辑:我得跑。 –

0

我认为问题出在你的变量$行之后。它不会在登录脚本中识别$ 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......... 
0

感谢您抽出时间来解决我的问题,我设法找到的错误。问题在于$ pass变量。在包含连接文件后,$ pass变量没有返回我期望的结果,因为连接文件中存在另一个$ pass变量。再次感谢你,对不起,我还在学习如何正确使用StackOverflow。