ホームページ  >  記事  >  バックエンド開発  >  ソルトされたパスワードが使用されている場合でも、メンバー サイトでパスワード チェックがバイパスされるのはなぜですか?

ソルトされたパスワードが使用されている場合でも、メンバー サイトでパスワード チェックがバイパスされるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-18 21:47:02696ブラウズ

Why Does My Member Site Bypass Password Checks Even When Salted Passwords Are Used?

データベース認証でソルテッド パスワードとプレーン パスワードを区別する方法

データベース認証では、パスワードを保護することが重要です。一般的な手法の 1 つは、ハッシュ化する前にパスワードにランダムな文字列 (ソルト) を追加するソルト付きパスワードの使用です。これにより、パスワードの解読が飛躍的に難しくなり、セキュリティが強化されます。

課題: メンバー ログインの検証

MySQL に保存されたソルト付きパスワードを使用してメンバー サイトを実装する場合、一般的なログイン認証処理中にエラーが発生します。ログイン試行はパスワード チェックを誤って回避し、サイトへの不正アクセスを許可しているようです。

問題コードの検査

次のコード スニペットは、メンバーのログインを検証するために使用されます。

$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'];
$saltedPW = $password . $salt;
$hashedPW = hash('sha256', $saltedPW);
$sqlQuery = "SELECT * FROM users WHERE name = '$name' AND password = '$hashedPW'";

if (mysqli_query($connect, $sqlQuery)){
    echo '<h1>Welcome to the member site '.$name.'</h1>';
} else {
    echo 'error adding the query: '.$sql_q.'<br> Reason: '.mysqli_error($connect);
}

解決策: 適切なパスワード検証

この問題は、SQL クエリで直接パスワード比較を使用することで発生します。保存されたパスワードはソルト処理されているため、この方法ではすべてのログイン試行が有効であると誤って解釈されます。これを修正するには、次の手順を実装する必要があります:

  1. データベースからソルトされたハッシュを取得します: クエリを実行して、対応するパスワード ハッシュ (ソルトを含む) を取得します。
  2. 入力されたパスワードとソルトされたハッシュを比較します: ハッシュからソルトとコスト要素を自動的に抽出するpassword_verify()関数を使用して、パスワードの信頼性を評価します。入力されたパスワードと保存されたハッシュの照合。

mysqli を使用したコード例:

// Connect to the database
$mysqli = new mysqli($servername, $username, $password, $dbname);

// Initialize variables
$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$password = mysqli_real_escape_string($mysqli, $_POST['password']);

// Fetch the salted hash for the specified username
$query = "SELECT password FROM users WHERE username = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->bind_result($hashedPassword);
$stmt->fetch();

// Verify the entered password
if (password_verify($password, $hashedPassword)) {
    // Login successful
    echo '<h1>Welcome to the member site '.$username.'</h1>';
} else {
    // Password did not match
    echo 'Invalid login credentials';
}

以上がソルトされたパスワードが使用されている場合でも、メンバー サイトでパスワード チェックがバイパスされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。