2017-09-15 20 views
-2

こんにちは私はpdoを使ってデータベースからハッシュされたパスワードを返し、パスワードが保護されている間にログインできるようにしています。パスワードをハッシュするサインアップページを作成しました。私は今これを解体しようとしています。私は近いと思いますが、これは何度も同じ場所に止まっていますが、誰かが私のコードを完成させるのを助けてくれることを願っていましたか?ハッシュされたパスワードの検証とログインの確認pdo php

PHP致命的なエラー:キャッチされていないエラー:/var/www/html/login.php:54\nStackトレースのブール値でメンバ関数fetch()を呼び出します。\ n#0 {メイン} \ nスローイン/ライン54上のVAR/WWW/HTML/login.php、リファラ:http://172.16.62.211/login.php

if (isset($_POST['submit'])){ 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $q = $handler->prepare('SELECT * FROM users WHERE username = ?'); 
    $query = $q->execute(array(
     $username)); 
    $_SESSION['username'] = $username; 
    $count = $q->rowCount(); 
    if ($count == 1 -> fetch(PDO::FETCH_ASSOC)){ 
     $hash_pwd = $count['password']; 
     $hash = password_verify($password, $hash_pwd); 

    if ($hash_pwd == 0) { 
     header("location: login.php?error=empty"); 
    } 

    else { 
    $q = $handler->prepare('SELECT * FROM users WHERE username = ? && password = $hash_pwd'); 
    $query = $q->execute(array(
     $username, 
     $password)); 

    $count = $q->rowCount(); 
     if($count == 1){ 
      $_SESSION['username'] = $username; 
      header("location: index.php"); 
      return; 
     } else { 
     echo '<p class="error-message3">'.'<br>'.'<br>'."You have ented an incorrecct login!<br>Please try again.".'</p>'; 
    }}}} 
    ?> 
+0

*「今私はこれを解体しようとしています。」* - それはどういう意味ですか?どちらが線54ですか? –

+0

クエリには1つのプレースホルダしかありませんが、 '$ q = $ handler-> prepare( 'SELECT * FROM users WHERE username =?&& password = $ hash_pwd');もう一つの理由で失敗しています。 –

+0

@ Fred-ii-ログインを有効にするために、データベース内のハッシュされたパスワードをデハッシュしようとしています。 –

答えて

0

あなた文句を言わないと、あなたCANT 'dehash' データベースからのパスワード。

通常のルーチンは基本的にof converting the password inserted by the user to your security logic encrypt and compare with the password stored in your db (hashed too)で、2つの値はvalidateと等しくなければなりません。

ハッシュが正しく行われた場合、パスワードは、何らかの形で不可能なものであり、あなたのアイデアに関するセキュリティ上の欠陥を指摘するものではありません。

if ($count == 1 -> fetch(PDO::FETCH_ASSOC)){ 
     $hash_pwd = $count['password']; 
     $hash = password_verify($password, $hash_pwd); 
     if ($hash === false) { 
      header("location: login.php?error=empty"); 
     } else { 

       $_SESSION['username'] = $username; 
       header("location: index.php"); 
       return; 
      } 
    } else { 
      echo '<p class="error-message3">'.'<br>'.'<br>'."You have ented an incorrecct login!<br>Please try again.".'</p>'; 
     } 

PS:コードをよりよくインデントし、上記のようにチェックしたpassword_verifyにチェックを繰り返していることに注意してください。

+0

大丈夫よ、ごめんなさい、デハッシュできませんが、どうすればパスワードを確認できますか? –

+0

'password_verify()'がtrueを返すかどうかを確認します。pinapple –

+0

私はすでに質問しました:ログイン時にユーザーが挿入したパスワードを変換してデータベースを比較します – calexandre

0

あなたはpassword_verifyの使用方法を理解する必要があり、それは(あなたのデータベースから)バージョンをハッシュ化された(ハッシュ解除済み)パスワードのバージョンとを取り、偽/それぞれtrueを返します。

<?php 
if (password_verify($raw, $hash)) { 

} 
?> 

あなたは、あなたのクエリでそれを比較する必要があります(ユーザ名が有効であれば)だけで提供されたユーザ名によってからパスワードを取得し、検証しません。

+0

ダウン投票者、説明してください?私の答えが間違っていたら、言ってください。投票や放棄はしないでください。 – Script47

関連する問題