首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 簡易登入驗證類實現:Session 管理與安全性隱憂分析

     編輯:PHP 相關知識

PHP 簡易登入驗證類實現

登入驗證是 Web 應用基礎功能。本文展示一個極簡的 checklogin 類別,透過建構子接收帳密,查詢資料庫比對,成功則寫入 Session 並跳轉,失敗則彈窗返回。

程式碼實現

<?php
class checklogin {
    var $name, $pwd;
    function __construct($username, $password) {
        $this->name = $username;
        $this->pwd = $password;
    }
    function checkinput() {
        global $db;
        $sql = "select * from tb_manager where name='$this->name' and pwd='$this->pwd'";
        $res = $db->query($sql);
        $info = $db->fetch_array($res);
        if ($info['name'] == $this->name and $info['pwd'] == $this->pwd) {
            $_SESSION['admin_name'] = $info['name'];
            $_SESSION['pwd'] = $info['pwd'];
            echo "<script>alert('登錄成功!);window.location.href='index.php';</script>";
        } else {
            echo "<script language='javascript'>alert('登錄失敗!');history.back();</script>";
            exit;
        }
    }
}
?>

嚴重安全性問題分析

問題風險等級說明
明文密碼儲存與比對🔴 致命資料庫儲存明文,SQL 直接比對明文,洩露即全洩露
SQL 注入漏洞🔴 致命帳密直接拼接 SQL,可繞過驗證或執行任意指令
Session 固定攻擊🟠 高未重新生成 Session ID,易遭竊取
XSS 輸出未轉義🟠 高直接輸出 JS 字串,若帳號含惡意腳本將執行
暴力破解無防護🟡 中無嘗試次數限制、驗證碼、IP 封鎖機制
使用已棄用 mysql_* 函數🔴 致命PHP 7+ 不支援,必須遷移

現代化安全重構要點

  1. 密碼雜湊:使用 password_hash() 儲存,password_verify() 驗證。
  2. 預處理語句:PDO/MySQLi 防止 SQL 注入。
  3. Session 安全:session_regenerate_id(true) 登入後重新生成 ID,設定 httponly/secure/samesite 旗標。
  4. 輸出編碼:htmlspecialchars() 防止 XSS。
  5. 速率限制:登入失敗計數 + 驗證碼/帳號鎖定/IP 封鎖。
  6. CSRF 保護:表單加入 Token 驗證。
  7. 分離關注點:驗證邏輯、Session 管理、回應輸出分離至不同類別/服務。

安全版本骨架

class AuthService {
    private $pdo;
    public function __construct(PDO $pdo) { $this->pdo = $pdo; }
    public function attempt(string $username, string $password): bool {
        $stmt = $this->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_regenerate_id(true);
            $_SESSION['user_id'] = $user['id'];
            return true;
        }
        return false;
    }
}

原範例僅適合理解基本流程,絕不可用於生產環境,請務必採用成熟認證框架(Laravel Auth、Symfony Security 等)或依照上述原則自行實現。

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