データベース認証でソルテッド パスワードとプレーン パスワードを区別する方法
データベース認証では、パスワードを保護することが重要です。一般的な手法の 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 クエリで直接パスワード比較を使用することで発生します。保存されたパスワードはソルト処理されているため、この方法ではすべてのログイン試行が有効であると誤って解釈されます。これを修正するには、次の手順を実装する必要があります:
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 サイトの他の関連記事を参照してください。