2016-04-09 12 views
-1

私は、電子メールアドレスとパスワードを使用してログインする必要があるプロジェクトで作業しています。そうするためには、データベースにあるものと一致するかどうかを確認するために入力したパスワードがあるかどうかをテストする必要があります。私はpassword_verify()を使ってMySQLiクエリ(SELECT password FROM users WHERE email='$email_login')をコンパイルする方法でMySQLiクエリを取得しようとしています。 mysqliクエリを文字列として取得

 <h1>Sign in</h1> 
     <form class="form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST"> 
      <input type="email" name="email_login" size="25" placeholder="Email address" required> 
      <br> 
      <br> 
      <input type="password" name="pass_login" placeholder="Password" required> 
      <br> 
      <br> 
      <input type="submit" name="login" value="Login"> 
     </form> 

すべてが2 password_verifyを除いて、それが必要として動作します。私はこのPHP/MySQLiをコードしています。フォームデータベースここ

-------------------------------------------------------------------- 
id | first_name | last_name | username | email   | password | 

1 John   Doe   john17  [email protected] (hashed) 

との

$email_login = $_POST["email_login"]; 
$pass_login = $_POST["pass_login"]; 
if(isset($_POST["email_login"]) && isset($_POST["pass_login"])) { 

     $sql_query = mysqli_query($conn, "SELECT password FROM users WHERE email='$email_login'"); 
     $pass_query = print_r($sql_query, 1); 
     echo $pass_query; 
     $pass_test= password_verify($pass_login, $pass_query); 

     $sql = mysqli_query($conn, "SELECT id FROM users WHERE email='$email_login' AND password='$pass_test' LIMIT 1"); 

     $userCount = mysqli_num_rows($sql); 
     if($userCount == 1) { 
       while($row = mysqli_fetch_array($sql)) { 
          $id = row["id"]; 
       } 
       $_SESSION["email_login"] = $email_login; 
       header("Location: index.php"); 
       exit(); 
     } else { 
       echo "It looks like you have an issue with your credentials."; 
       exit(); 
     } 
} 

スキーマです()行。試してみて、間違っているかを把握するために、私がしますprint_r()を使用して文字列として$pass_test変数を印刷し、この得た:

mysqli_result Object ([current_field] => 0 [field_count] => 1 [lengths] => [num_rows] => 1 [type] => 0) 

私は形にmysqliのクエリの結果を得ることができ、安全な方法はありますがpassword_verify()を使ってテストできますか?

+0

私はこのコードはオンラインチュートリアルの一部であると確信しています。私はすでに何かを見た気分がある。そして、それは非常に悪いチュートリアルだと言わざるを得ない。 –

+0

'フェッチする '必要があります。これはSQLインジェクションに開放されています。 – chris85

+0

@YourCommonSense実際、私はYouTubeでのチュートリアルを見ながらこれに取り組んできましたが、これは時代遅れです。私は、最新のphp/mysqliを使用している間、この時点でサンプルとして使用しています。 – dashd90e8

答えて

0

クイックチェックとして、$pass_loginを二重引用符で囲みます。ドキュメントの最初のコメントhereを参照してください。

第2に、私はこれを必要以上に複雑にしていると思います。

$pass_login = password_hash ($_POST["pass_login"]); 

$sql = mysqli_query($conn, "SELECT id FROM users WHERE email='$email_login' AND password="$pass_login" LIMIT 1"); 

偽の返品を受け取った場合、それは失敗したログインです。 。 。

更新:だから

は、今、私はこれを見に多くの時間を持っていたことを、ここで私は作業例として思い付いたものです。あなたは気づいたあなたは

$conn = mysqli_connect(yadda, yadda, yadda);//obviously, your credentials here 
if (!$conn) { 
    echo "Error: Unable to connect to MySQL." . PHP_EOL; 
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; 
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; 
    exit; 
} 

echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL; 
echo "Host information: " . mysqli_get_host_info($conn) . PHP_EOL; 

/*This checks the password on login so as long as your $_POST variables are set from your form you should be all set: */ 

$_POST["email_login"] = '[email protected]'; 
$_POST["pass_login"] = "john17"; 

$email_login = $_POST["email_login"]; 
$pass_login = $_POST["pass_login"]; 


if(isset($_POST["email_login"]) && isset($_POST["pass_login"])) { 

    if ($result = $conn->query("SELECT password FROM test_table WHERE email='$email_login'")) { 

     printf("Select returned %d rows.\n", $result->num_rows); 
     $userCount = $result->num_rows; 

     if($userCount == 1) { 

      while($user_array = $result->fetch_array()){ 
       //var_dump($user_array); 
       $saved_hashed_pass = $user_array[0]; 
       $auth = password_verify($_POST["pass_login"], $saved_hashed_pass); 
       if($auth === true) { 
        echo "It looks like you are approved"; 
        //$_SESSION["email_login"] = $email_login; 
        //header("Location: index.php"); 
       } else { 

        echo "It looks like you have an issue with your credentials."; 
        exit(); 
       } 

      } 

     } else { 
      echo "It looks like you have an issue with your credentials."; 
      //exit(); 
     } 

     /* free result set */ 
     $result->close(); 
    } else { 
     printf("Error: %s\n", $conn->error); 
} 
+0

あなたはpassword_hashの仕組みや最初のコメントの意味を理解していないのは面白いです。どちらの提案も間違っています。 –

+0

助けてください?あなたはこれについてたくさん知っているようです。 – dg4220

1

を接続していることを確認し

$hashed_pass = password_hash("john17", PASSWORD_DEFAULT); 

まず、ユーザーが入力するときに保存する前にパスワードの入力をハッシュ:私はオブジェクト指向スタイルでこれを書いていますwhileループの中のその行には '$'記号がありません。

while($row = mysqli_fetch_array($sql)) { 
          $id = $row["id"]; 
           ^ /*missing '$' 

       } 
関連する問題