0

PHPASS を使用して暗号化されたパスワードを保存し、ログイン時に比較しています。

ここにコードがあります

ob_start();
$userName = $password = "";
$userNameErr = $passwordErr = $loginErr = "";
$hasher = new PasswordHash(8, false);

if (isset($_POST['subEmployee'])) {
    if (empty($_POST['user_name'])) {
        $userNameErr = "User name is required";

    } else {
        $userName = check_input($_POST['user_name']);
        if (!preg_match("/^[0-9_a-zA-Z]*$/", $userName)) {
            $userNameErr = "Only letters, numbers and '_' allowed";
        }
    }
    if (empty($_POST['password'])) {
        $passwordErr = "Password is required";
    }else{
        $password = check_input($_POST['password']);
    }

    $active = 1;
    $loginUser = $db->prepare("SELECT password FROM users WHERE user_name=? AND activity=?");
    $loginUser->bind_param('si', $userName, $active);
    if ($loginUser->execute()) {
        $results = $loginUser->get_result();
        if ($results->num_rows == 1) {
            $row = $results->fetch_object();
            $stored_hash = "*";
            $stored_hash = $row->password;
            $check = $hasher->CheckPassword($password, $stored_hash);
            if ($check) {
                $_SESSION['name'] = $row->first_name;
                $_SESSION['userId'] = $row->id;
                $_SESSION['user'] = 1;
                print_r($_SESSION);
                header("Location:?pid=4");
            } elseif (!empty($_POST['user_name']) && !empty($_POST['password'])) {
                $loginErr = "'Invalid Login Information'";
            }
        }
    }
}

これまでのところ、常に同じメッセージ「無効なログイン情報」が表示されます。このようにパスワードを保存する登録フォームを作成しました。

$hasher = new PasswordHash(8, false);
$hash = md5(rand(0, 1000));

if (empty($_POST['password'])) {
        $error ['passwordErr'] = "Password is required";
    } elseif (strlen($_POST['password']) < 8) {
        $error ['passwordErr'] = "<span class='notAllowed'>Chose password with at last eight characters</span>";
    } elseif (strlen($_POST['password']) > 72) {
        $error ['passwordErr'] = "<span class='notAllowed'>Password max 72 characters</span>";
    } elseif ($_POST['password'] !== $_POST['confirm']) {
        $error ['passwordErr'] = "Password don't matching";
    } else {
        $password = $hasher->HashPassword($password);
    }

データベースをチェックすると、パスワードがハッシュされているようで、ユーザー名がそこにあり、すべて問題ありません

ただし、このメッセージは「無効なログイン情報」として引き続き表示されます。

この2行は正しいですか

$loginUser = $db->prepare("SELECT password FROM users WHERE user_name=? AND activity=?");
    $loginUser->bind_param('si', $userName, $active);

ログインコードはOKですか?

私もこれを試してみます

更新 コードを更新しました

if (isset($_POST['subEmployee'])) {
    $error=array();

    $hash_cost_log2 = 8;
    $hash_portable = FALSE;
    $hasher = new PasswordHash($hash_cost_log2, $hash_portable);

    if (empty($_POST['user_name'])) {
        $userNameErr = "User name is required";

    } else {
        $userName = check_input($_POST['user_name']);
        if (!preg_match("/^[0-9_a-zA-Z]*$/", $userName)) {
            $userNameErr = "Only letters, numbers and '_' allowed";
        }
    }
    if (empty($_POST['password'])) {
        $passwordErr = "Password is required";
    } else {
        $password = $_POST['password'];
    }
    $active = 1;

    $loginUser = $db->prepare("SELECT password FROM hired_person_info WHERE user_name=? AND activity=?");
    $loginUser->bind_param('si', $userName, $active);
    if ($loginUser->execute()) {
        $results = $loginUser->get_result();
        if ($results->num_rows == 1) {
            $row = $results->fetch_object();
            $stored_hash = "*";
            $stored_hash = $row->password;
            $check = $hasher->CheckPassword($password, $stored_hash);
            if ($check) {
                $_SESSION['name'] = $row->first_name;
                $_SESSION['userId'] = $row->id;
                $_SESSION['user'] = 1;
                print_r($_SESSION);
                header("Location:?pid=4");
            } elseif (!empty($_POST['user_name']) && !empty($_POST['password'])) {
                $loginErr = "'Invalid Login Information'";
            }
        } else {
            $loginErr = "'We didn't find any users'";
        }
    }
}

これをPHPassのマニュアルから追加

$hash_cost_log2 = 8;
        $hash_portable = FALSE;
        $hasher = new PasswordHash($hash_cost_log2, $hash_portable);

ここでどこが間違っているのか誰か教えてくれませんか

編集 これは私のcheck_input()コードです

function check_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

PHP 5.3.29を使用しています

ありがとう

4

2 に答える 2

0

これらは私がチェックするいくつかのポイントです:

1) 登録ハンドラーで POST 変数を直接チェックしますが、ハッシュの場合は変数 $password を使用します。たとえば、次のように常に同じ方法で入力にアクセスします。

$password = $hasher->HashPassword($_POST['password']);

2)check_input()ハッシュ値を計算し、このハッシュ値はとにかく「安全」であるため、この関数はパスワードにはお勧めしません。他のユーザー入力についても、あなたと同じように検証する必要がありますが、エスケープはできるだけ遅く、特定の出力に対してのみ行う必要があります。そのため、この関数htmlspecialchars()はユーザー入力のために呼び出すのではなく、常に HTML に出力する前に呼び出す必要があります。

3) ログイン ハンドラーで、POST 変数を使用して 1 回、変数 $password を使用して 1 回、パスワードにアクセスします。変数 $password は if ステートメントでのみ設定されるため、入力が空の場合はエラーを埋めますが、初期化されていない $password 変数を使用して続行します。変数の最初に入力するか、常に POST 変数を使用してください。

4) PHP 5.3.29 を使用しているためpassword_hash()互換パックで新しい関数を使用できます。ここで PHPass ライブラリが問題になるとは思いませんが、新しい関数の例を次に示します。

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

5) もう 1 つのよくある間違いは、ハッシュ値を格納するためのデータベース フィールドが短すぎることです。varchar(60) の長さが必要です。パスワード ハッシュの 1 つを提供していただけないでしょうか (もちろん、例にすぎません)。

于 2014-09-29T07:16:35.160 に答える