Thông thường các nhà phát triển phải vật lộn với việc xác minh mật khẩu đăng nhập, vì họ không chắc chắn cách xử lý băm mật khẩu được lưu trữ. Họ biết rằng mật khẩu phải được băm bằng một hàm thích hợp như password_hash ( )
và lưu trữ chúng trong varchar(255)
lĩnh vực:
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
Trong biểu mẫu đăng nhập, chúng tôi không thể xác minh mật khẩu trực tiếp bằng SQL, cũng như không thể tìm kiếm nó, bởi vì các hàm băm được lưu trữ đã bị muối hóa. Thay vào đó, chúng tôi ...
- phải đọc mật khẩu băm từ cơ sở dữ liệu, tìm kiếm theo id người dùng
- và sau đó có thể kiểm tra mật khẩu đăng nhập đối với hàm băm được tìm thấy bằng password_verify () chức năng.
Dưới đây, bạn có thể tìm thấy một số mã ví dụ, hiển thị cách xác minh mật khẩu bằng mysqli sự liên quan. Mã không có lỗi kiểm tra để làm cho nó có thể đọc được:
/**
* 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 db, searching by username
$sql = 'SELECT password FROM users WHERE username = ?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $_POST['username']); // 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);
}
Lưu ý rằng ví dụ sử dụng các câu lệnh chuẩn bị sẵn để tránh SQL-injection, không cần thiết phải thoát trong trường hợp này. Một ví dụ tương đương để đọc từ pdo kết nối có thể giống như sau:
/**
* 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 db, searching by username
$sql = 'SELECT password FROM users WHERE username = ?';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, $_POST['username'], 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);
}