2017-07-25 34 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。