2017-07-25 9 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番目のコードブロックで宣言されていません。

  • 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が2番目のコードブロックにどのように設定されているか、また最初のコードブロックで実際に何が行われるのかを示すことは非常に役に立ちます。

コードのさまざまな部分が改善の余地があります。

さらに、論理構造について慎重に検討してください。$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を正しく使う方法を学んでいます。

関連する問題