2017-01-29 6 views
-4

mysqliとhashpasswordを使用しています。 パスワードを使用してログインすることができず、理由がわかりません。 私は全力を尽くしましたが、全く動かなかったのです。Mysqli:ハッシュされたパスワードでログインできません。

私のデータベースにはutf8が使用されています。

これは私のregiterのPHP

<?php 
if(isset($_POST["register"])){ 

    if(!empty($_POST['name']) && 
     !empty($_POST['studno']) && 
     !empty($_POST['password']) && 
     !empty($_POST['cpassword']) && 
     !empty($_POST['email'])) 
    { 
     $name=$_POST['name']; 
     $studno=$_POST['studno']; 
     $password= password_hash($_POST['password'],PASSWORD_BCRYPT); 
     $email=$_POST['email']; 

     $con=mysqli_connect('localhost','root','') or die(mysqli_error($con)); 
     mysqli_select_db($con,'inventory') or die("cannot select DB"); 

     $query=mysqli_query($con,"SELECT * FROM users WHERE studno='".$studno."'"); 
     $numrows=mysqli_num_rows($query); 
     if($numrows==0) { 
      $sql = "INSERT INTO users(name,studno,email,password) " 
       . " VALUES('$name','$studno','$email','$password')"; 

      $result=mysqli_query($con,$sql); 
      if ($_POST['password'] == $_POST['cpassword']) { 
       if ($result) { 
        header("Location: index.php?registered=1"); 
       } 
      } else { 
       header("Location: signup.php?passwordnotmatch=1"); 
      } 
     } else { /* numrows != 0 */ 
      header("Location: signup.php?alreadyinuse=1"); 
     } 

} else { 
    header("Location: signup.php?allfieldisrequired=1"); 
    } 
} 
?> 

これはPHPで私のログです。

<?php 
if (isset($_POST["login"])) { 
    if (!empty($_POST['studno']) && !empty($_POST['password'])) { 
     $studno=$_POST['studno']; 
     $password=$_POST['password']; 
     $con=mysqli_connect('localhost','root','') or die(mysql_error($con)); 
     mysqli_select_db($con,'inventory') or die("cannot select DB"); 
     $query=mysqli_query($con,"SELECT * FROM users WHERE studno='".$studno."' AND password='".$password."'"); 
     $numrows=mysqli_num_rows($query); 
     if ($numrows!=0) { 
      while($row=mysqli_fetch_assoc($query)) { 
       $dbstudno=$row['studno']; 
       $dbpassword=$row['password']; 
      } 
      if ($studno == $dbstudno && password_verify($dbpassword,$row['password']))) { 
       session_start(); 
       $_SESSION['sess_user']=$studno; 
       /* Redirect browser */ 
       header("Location: home.php"); 
      } 
     } else { 
      header("Location: index.php?error=1"); 
     } 
    } else { 
     header("Location: index.php?missing=1"); 
    } 
} 
+1

実際にコードを正しくフォーマットする必要があります。これは読みにくいです。 – Carcigenicate

+1

ハッシュにパスワードを入力するのではなく、2つのハッシュを確認しようとしています。どちらも同じ行です。 –

+0

@ Fred-ii-パスワードのみを確​​認するにはどうすればよいですか? –

答えて

0

同じパスワードを同じハッシュで検証しています。

password_verify($password, $dbpassowrd); 

を使用して、あなたのコードは、SQLインジェクション攻撃に簡単に脆弱です。それを検証し、ユーザー入力をサニタイズし、準備されたステムを使用します。

1

多くの人がすでにこのコメントが、私は答えとして、それを掲示しなければならない。

あなたのコードで間違ってはかなりいくつかのものがあります。

1)あなたがに対するユーザーの入力を検証する必要があるが、データベースではなく、データベースに対するデータベースです。これは、次の行が動作することを意味します:

password_verify($password,$row['password']) 

2)あなたのSQLクエリは、SQLインジェクションを防ぐための何かを持っていません。

3)登録ページではユーザーの反復が可能です。

4)データベースの最初の行だけを取得するためにwhileループを使用しないでください。単一のmysqli_fetch_assocを使用すると、最初の行が返されます。また、結果が1つしかない場合は、クエリの最後にLIMIT 1を使用します。

5)データベースから選択する場合は、返されるすべての列が必要であることが絶対に確実でない限り、必ず返す必要のある列を指定します。これによりクエリが大幅に高速化されます。

6)使用するすべてのPHPファイルで接続を作成するのではなく、mysqli接続をグローバルに作成します(たとえば、database.phpファイルを作成してデータベースに接続する)。

7)セッションをグローバルに開始します(たとえば、セッションが作成され、現在ログインしているユーザーデータが保存されているuser.phpファイルを作成します)。あなたの登録ページはログインしているユーザーを確認する必要があります。また、ログインページ(ログインしている場合はなぜログインしていますか?)があるので、どこかでセッションをグローバルに開始する必要があります。

0

あなたがする必要があるのは簡単です。あなたのコードは、この1つの理由で決して結果を返すことはありません"SELECT * FROM users WHERE studno='".$studno."' AND password='".$password."'"登録時にパスワードをハッシュとして保存したので、結果は決して返されません。ユーザーログが一致するものをすべて選択しているときwhere節はstudnopasswordなので、ユーザーからのパスワードはハッシュされていないので、これは決して機能しません。ハッシュされたパスワードと決して一致しません。 where句からパスワードを削除し、id句にwhere句だけを入れる必要があります。

ここでも、これはpassword_verify($dbpassword,$row['password']))が$ dbpassswordと$row['password']を覚えて間違っては同じものですので、基本的に、あなたのpassword_verify()このpassword_verify(storedHash,storedHash)のように読んでいるあなたは同じ保存されたハッシュに対して保存されたハッシュを検証しているあなたは、あなたのスクリプト$dbpassword=$row['password'];でこれを持って覚えています。 password_verify()は常に以下のようになります。password_virify(PasswordFromTheUserInput,StoredHash)ユーザー入力から保存されたハッシュに対してパスワードを確認する必要があります。それはあなたのスクリプトは次のようになりますと言われて

だから:これはロジックは何らかの方法上記に同一であることが必要がありますが、私は何かを見逃しているかもしれないのに役立ちます

<?php 
ob_start(); 
session_start(); 

//Extract the inputs from the user 



$query = ("SELECT studno,password FROM users WHERE studno='" . $studno . "'"); 
$result = $con->query($query); 
if ($result->num_rows > 0) { 
    // we have the results 
    while ($row = $result->fetch_assoc()) { 

     $dbstudno = $row['studno']; 
     $dbpassword = $row['password']; 

     // check user password against stored hash 
     if (password_verify($password, $dbpassword)) { 
      // password correct start a session 

      $_SESSION['sess_user'] = $studno; 
      /* Redirect browser */ 
      header("Location: home.php"); 
     } else { 

      header("Location: index.php?error=1"); 

     } 


    } 
} else { 
    header("Location: index.php?missing=1"); 
} 
?> 

希望、私はよくありませんよmysqliでは、私は人生のほとんどをPDOで使います。

注意:@ジョン・スミスの答えを考慮に入れて、彼はあなたが適用する必要がある非常に重要な点を作った。

関連する問題