-3

コスト値を変更するだけで、このライブラリを使用してハッシュの作成を適切に実装しました。今、私は実際にユーザーを確認することに固執しています。現在のシステムでは、ユーザーがアクティブ化されているかどうかを確認してから、セッションを開始する必要もあります。これは私が持っているものです:

 <?php 
require('core/init.php');

// Required field names
$required = array('username', 'password');

// Loop over field names, make sure each one exists and is not empty
$error = false;
    foreach($required as $field) {
        if (empty($_POST[$field])) {
        $error = true;
        }
    }
//This is what will make the password 
$form_password = $_POST['password'];
$hash = password_hash($form_password, PASSWORD_BCRYPT);
    if ($error) {
        echo "Please Check username and password field!";
    }
        else { 
                if (password_verify($form_password, $hash)) {
                    $member_username = $_POST['username'];
                    $query = $dbh->prepare("SELECT * FROM users WHERE username = :user");
                    $query->bindParam(':user', $member_username);
                    $query->execute();
                    $row = $query->fetch();

                        if($row['activated'] > 0){
                            $_SESSION["user_id"] = $row['user_id'];
                            header("location: login_success.php");

                            }   else {
                                    echo "Account not activated wait for system administrator!";

                                }


                } else {
                            Echo "Wrong password or username please <a href='index.php'><bold>Retry!</bold></a>";

                        }


        }

私が行ったことは、パスワード検証が実際に真である場合にクエリを実行することです。次に、そのクエリはアクティブ化された行をフェッチして、値が0より大きいかどうかを確認します。大きい場合は、ユーザーはアクティブ化されません。

ただし、私のエラーは、何を入力しても、間違ったパスワードまたはユーザー名を取得し続けることです。再試行してください。

パスワードとユーザーが間違っていないことはわかっています。password_compatの検証部分を適切に実装したかどうかについて、私は2番目に推測しています。

どんな助けでも素晴らしいでしょう。ありがとうございました。

編集 :

コメントでdev-null-dwellerが回答した質問。

問題:ライブラリの$password変数と$hash変数をグローバルとして使用できないことに気づきませんでした。それでそれを修正するために私は変数を作成しました、そしてすべてはうまく働いています。ありがとう!

4

1 に答える 1

3

$passwordとは両方とも$hashコードで定義されていません。$passwordから取得できますが、データベースから取得できるため$_POST、パスワード$hashを確認する前にクエリを実行する必要があります。

if ($error) {
    echo "Please Check username and password field!";
} else {
    $member_username = $_POST['username'];
    $form_password = $_POST['password'];
    $query = $dbh->prepare("SELECT * FROM users WHERE username = :user");
    $query->bindParam(':user', $member_username);
    $query->execute();
    $row = $query->fetch();
    if (!$row || !password_verify($form_password, $row['password'])) {
        if ($row['activated'] > 0) {
            $options = array(/* Your current hashing options */);
            $algorithm = PASSWORD_BCRYPT;
            if (password_needs_rehash($row['password'], $algorithm, $options)) {
                $hash = password_hash($row['password'], $algorithm, $options);
                /* Store new hash in db */
            }
            $_SESSION["user_id"] = $row['user_id'];
            header("location: login_success.php");
        } else {
            echo "Account not activated wait for system administrator!";
        }
    } else {
        Echo "Wrong password or username please <a href='index.php'><b>Retry!</b></a>";
    }
}
于 2012-12-29T21:11:48.897 に答える