ホームページ > データベース > mysql チュートリアル > データベースに保存されたソルテッドパスワードを使用してユーザーを安全に認証するにはどうすればよいですか?

データベースに保存されたソルテッドパスワードを使用してユーザーを安全に認証するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-05 03:39:09
オリジナル
913 人が閲覧しました

How to Safely Authenticate Users with Salted Passwords Stored in a Database?

データベースからソルト付きパスワードを撤回してユーザーを認証する方法

データベースに保存されたソルト付きパスワードを使用して会員制サイトを実装する場合、正しい認証を保証することが重要になります。ただし、ユーザーの存在を確認しようとするとエラーが発生する可能性があります。

問題

以下のコード スニペットは、メンバーが存在するかどうかを確認する間違った方法を示しています。

$name = mysqli_real_escape_string($connect, $_POST['name']);
$password = mysqli_real_escape_string($connect, $_POST['password']);
$saltQuery = "SELECT salt FROM users WHERE name = '$name';";
$result = mysqli_query($connect, $saltQuery);
if ($result === false){
    die(mysqli_error());
}
$row = mysqli_fetch_assoc($result);
$salt = $row['salt'];
ログイン後にコピー

このコードはデータベースからソルトを取得しようとしますが、クエリが返されると失敗します。 false.

解決策

ユーザーのログイン資格情報を正確に検証するには、保存されているパスワード ハッシュを取得し、ユーザーが入力したパスワードと比較する必要があります。このプロセスには、password_hash() 関数と password_verify() 関数の使用が含まれます。

MySQLi のサンプル コード

/**
 * mysqli example for a login with a stored password-hash
 */
$mysqli = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);
$mysqli->set_charset('utf8');

// Find the stored password hash in the database, searching by username
$sql = 'SELECT password FROM users WHERE name = ?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $_POST['name']); // it is safe to pass the user input unescaped
$stmt->execute();

// If this user exists, fetch the password-hash and check it
$isPasswordCorrect = false;
$stmt->bind_result($hashFromDb);
if ($stmt->fetch() === true) {
  // Check whether the entered password matches the stored hash.
  // The salt and the cost factor will be extracted from $hashFromDb.
  $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb);
}
ログイン後にコピー

サンプルコードPDO

/**
 * pdo example for a login with a stored password-hash
 */
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8";
$pdo = new PDO($dsn, $dbUser, $dbPassword);

// Find the stored password hash in the database, searching by username
$sql = 'SELECT password FROM users WHERE name = ?';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, $_POST['name'], PDO::PARAM_STR); // it is safe to pass the user input unescaped
$stmt->execute();

// If this user exists, fetch the password hash and check it
$isPasswordCorrect = false;
if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) {
  $hashFromDb = $row['password'];

  // Check whether the entered password matches the stored hash.
  // The salt and the cost factor will be extracted from $hashFromDb.
  $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb);
}
ログイン後にコピー

以上がデータベースに保存されたソルテッドパスワードを使用してユーザーを安全に認証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート