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

PHP Session 實現用戶登錄驗證完整指南

     編輯:PHP 相關知識

相比 Cookie 存儲在客戶端、易被竄改、有大小限制,Session 數據存儲在服務端,安全性更高,且無長度限制。本文系統講解 Session 登錄驗證全流程,含生命周期控制、跨頁面驗證、對象存儲、自定義存儲路徑等進階用法。

核心優勢回顧

  • 服務端存儲:用戶無法直接修改 Session 文件內容。
  • 權限隔離:PHP 自動設置 Session 文件權限為系統讀寫,FTP 不可改。
  • 減少 DB 查詢:登錄成功寫入 $_SESSION['admin'] = true,後續頁面只判斷該值,無需每次查庫驗證密碼。
  • 傳輸安全:密碼僅登錄時傳輸一次,Session ID 隨機生成,難以偽造。

基礎流程:登錄 → 驗證 → 登出

1. 登錄頁 login.php

<?php
// 接收表單提交
$posts = $_POST;
foreach ($posts as $key => $value) {
    $posts[$key] = trim($value);
}
$username = $posts['username'];
$password = md5($posts['password']); // 實際建議用 password_hash()

// 查詢數據庫(示例用簡易寫法,實際請用預處理語句防注入)
$query = "SELECT `username` FROM `user` WHERE `username` = '$username' AND `password` = '$password'";
$userInfo = $DB->getRow($query);

if (!empty($userInfo)) {
    session_start();
    $_SESSION['admin'] = true;        // 標記登錄狀態
    $_SESSION['username'] = $username; // 可選:存用戶名
    header('Location: dashboard.php');
    exit;
} else {
    die('用戶名或密碼錯誤');
}
?>

2. 需驗證頁面通用檢查

<?php
$admin = false; // 防全局變量污染
session_start();

if (isset($_SESSION['admin']) && $_SESSION['admin'] === true) {
    echo "您已成功登錄,歡迎 " . ($_SESSION['username'] ?? '用戶');
} else {
    $_SESSION['admin'] = false;
    die('您無權訪問,請 登錄');
}
?>

3. 登出 logout.php

<?php
session_start();
// 方式一:銷毀單個變量
unset($_SESSION['admin']);
// 方式二:銷毀整個 Session(推薦徹底登出)
session_destroy();
header('Location: login.php');
?>

Session 生命周期控制

默認關閉瀏覽器即失效。若需「記住我」功能(如保持 1 天):

<?php
// 方法一:手動 setcookie 綁定 Session ID 生命周期
session_start();
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, '/');

// 方法二:session_set_cookie_params() 必須在 session_start() 之前調用
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION['admin'] = true;
?>

注意:IE6 下 session_set_cookie_params() 有 Bug,建議統一用方法一。

禁用 Cookie 時的 URL 傳遞 Session ID

<?php
$lifeTime = 24 * 3600;
$sessionName = session_name(); // 默認 PHPSESSID
$sessionID   = $_GET[$sessionName] ?? '';
if ($sessionID) session_id($sessionID); // 手動設置 ID

session_set_cookie_params($lifeTime);
session_start();
$_SESSION['admin'] = true;
?>

此時 URL 形如 page.php?PHPSESSID=abc123...,需注意不要在郵件/外鏈中泄露帶 SID 的 URL。

自定義 Session 存儲路徑(共享主機安全必做)

<?php
$savePath = '/home/user/session_data/'; // 必須不可 Web 訪問、可讀寫
session_save_path($savePath);           // 必須在 session_start() 前調用
session_set_cookie_params(24 * 3600);
session_start();
$_SESSION['admin'] = true;
?>

Session 中存儲對象(自動序列化/反序列化)

<?php
// person.php
class Person {
    public $age;
    public function setAge($age) { $this->age = $age; }
    public function output() { echo $this->age; }
}

// setage.php
session_start();
require_once 'person.php';
$p = new Person();
$p->setAge(21);
$_SESSION['person'] = $p; // PHP 自動 serialize
echo '<a href="output.php">查看年齡</a>';

// output.php
ini_set('unserialize_callback_func', 'mycallback');
function mycallback($classname) { include_once $classname . '.php'; }
session_start();
$person = $_SESSION['person']; // PHP 自動 unserialize
$person->output(); // 輸出 21
?>

關鍵:反序列化時類定義必須已加載,unserialize_callback_func 回調可自動載入類文件。

進階:自定義 Session 處理器

若需將 Session 存入 Redis、MySQL 或實現分布式共享,請使用 session_set_save_handler() 註冊自定義讀寫回調(見下文專文)。

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