註冊時:$hash = password_hash($password, PASSWORD_DEFAULT); 存入資料庫。
登錄時:if (password_verify($inputPassword, $hashFromDB)) { /* 成功 */ }
md5() 做密碼哈希<?php
// login.php
session_start();
require 'db.php'; // PDO 連接
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = trim($_POST['username']);
$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user && password_verify($password, $user['password_hash'])) {
$_SESSION['user_id'] = $user['id'];
header('Location: dashboard.php');
exit;
} else {
$error = "用戶名或密碼錯誤";
}
}
?>
<form method="post">
<input name="username" required>
<input name="password" type="password" required>
<button type="submit">登錄</button>
<?php if (!empty($error)) echo "<p class='error'>$error</p>"; ?>
</form>
$hash = password_hash($password, PASSWORD_DEFAULT); // 當前推薦 bcrypt
$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");
$stmt->execute([$username, $hash]);
password_needs_rehash() 檢測並遷移拋棄 MD5,拥抱 password_hash() / password_verify()。這是 PHP 5.5+ 內建、經過專家審計、自動處理鹽值與成本因子的標準方案。配合 HTTPS、限流、2FA,才能構建真正安全的認證體系。