집 >데이터 베이스 >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'];
이 코드는 데이터베이스에서 솔트를 검색하려고 시도하지만 쿼리가 반환되면 실패합니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!