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

PHP Cookie 完整操作指南:創建、讀取、刪除與最佳實踐

     編輯:PHP 相關知識

Cookie 是 Web 開發中實現客戶端狀態保持的核心機制。本文系統梳理 PHP 中 Cookie 的創建、更新、讀取、刪除操作,並提供安全性與效能的最佳實踐建議。

一、創建與更新 Cookie

基本語法

setcookie(string $name, string $value = "", int $expire = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false): bool

常用範例

<?php
// 1. 基礎 Cookie(瀏覽器關閉即失效,即「會話 Cookie」)
setcookie('UserName', 'zs');

// 2. 指定過期時間:2 週後過期
$expire = time() + 2 * 7 * 24 * 3600; // 1209600 秒
setcookie('UserName', 'zs', $expire);

// 3. 完整參數:跨子域、HTTPS 強制、防 XSS
setcookie(
    'UserName', 
    'zs', 
    $expire, 
    '/',           // path: 整站可用
    '.example.com', // domain: 支援所有子域
    true,           // secure: 僅 HTTPS 傳輸
    true            // httponly: 禁止 JS 讀取,防 XSS
);

關鍵點:

  • expire=0 或省略 → 會話 Cookie,瀏覽器關閉銷毀
  • expire > time() → 持久化 Cookie,寫入硬碟
  • expire < time() → 立即刪除 Cookie
  • Cookie 必須在 任何輸出之前 發送(包括空白、BOM、HTML)

二、讀取 Cookie 值

<?php
// 直接讀取(不存在時觸發 Notice)
$uName = $_COOKIE['UserName'];

// 安全讀取:先判斷是否存在
if (!empty($_COOKIE['UserName'])) {
    $uName = $_COOKIE['UserName'];
} else {
    $uName = '遊客';
}

// 現代寫法:null 合併運算符 (PHP 7+)
$uName = $_COOKIE['UserName'] ?? '遊客';

三、刪除 Cookie

<?php
// 方法 1:設定過期時間為過去
setcookie('UserName', '', time() - 3600);

// 方法 2:值設為空字串,過期時間為過去
setcookie('UserName', null, time() - 3600);

// 方法 3:僅設定過期時間(值會被忽略)
setcookie('UserName', '', time() - 1);

// 刪除當前域名下所有 Cookie(慎用)
foreach ($_COOKIE as $key => $val) {
    setcookie($key, '', time() - 3600, '/');
}

注意: 刪除時 path、domain、secure、httponly 必須與創建時一致,否則無法覆蓋原 Cookie。

四、進階:陣列式 Cookie 與 JSON 序列化

Cookie 單值限制 4KB,但可存儲序列化數據:

<?php
// 寫入陣列數據
$userData = ['id' => 101, 'name' => '張三', 'role' => 'admin'];
setcookie('user_profile', json_encode($userData), time() + 86400, '/', '', true, true);

// 讀取並解析
$userProfile = json_decode($_COOKIE['user_profile'] ?? '{}', true);
echo $userProfile['name']; // 張三

五、安全性最佳實踐

策略說明實現方式
HttpOnly防止 XSS 竊取 Cookiesetcookie 最後參數設 true
Secure僅 HTTPS 傳輸setcookie 第 6 參數設 true(生產環境必開)
SameSite防禦 CSRF 攻擊PHP 7.3+ 支援 setcookie(..., ['samesite' => 'Lax'])
加密敏感值避免明文存儲用戶 ID、權限等使用 openssl_encrypt 或框架內置加密
最小化作用域限制 path、domain 範圍按業務需求設定最窄路徑

六、常見坑點總結

  • ❌ 在輸出 HTML 後調用 setcookie → 必須在輸出前
  • ❌ 跨域共享 Cookie 未設定 domain → 需設 .example.com(前綴點)
  • ❌ 刪除 Cookie 參數不匹配 → path/domain/secure 必須一致
  • ❌ 信任 Cookie 直接用於權限判斷 → 必須服務端驗證 Session/Token
  • ✅ 使用框架封裝 → Laravel Cookie::make()、ThinkPHP cookie() 等自動處理安全參數

Cookie 是無狀態 HTTP 的關鍵補充,掌握其完整生命週期管理,配合安全策略,能構建更可靠的用戶體驗。建議在項目中統一封裝 Cookie 操作類,集中管理安全參數與序列化邏輯。

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