首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

PHP 登錄頁面:MD5 密碼驗證的正確實現(附安全建議)

     編輯:程式設計疑難解答

核心邏輯

註冊時:$hash = password_hash($password, PASSWORD_DEFAULT); 存入資料庫。
登錄時:if (password_verify($inputPassword, $hashFromDB)) { /* 成功 */ }

為什麼不直接用 MD5?

  • MD5 無鹽值,彩虹表秒破
  • 無成本因子,GPU 可秒速暴力破解
  • PHP 官方 棄用 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]);

進階安全清單

  1. HTTPS 全站強制:防止明文傳輸被竊聽
  2. CSRF Token:表單隱藏域驗證來源
  3. 限制嘗試次數:Redis 記錄 IP/用戶名失敗計數,超限鎖定 15 分鐘
  4. 雙因子認證 (2FA):TOTP / 簡訊碼
  5. 定期升級哈希算法:password_needs_rehash() 檢測並遷移

總結

拋棄 MD5,拥抱 password_hash() / password_verify()。這是 PHP 5.5+ 內建、經過專家審計、自動處理鹽值與成本因子的標準方案。配合 HTTPS、限流、2FA,才能構建真正安全的認證體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved