| 參數 | 說明 | 範例 |
| name | Cookie 名稱 (必填) | "user_id" |
| value | 儲存值 | "12345" |
| expire | Unix 時間戳過期時間,0=會話結束 | time()+3600 (1小時) |
| path | 生效路徑,預設當前目錄 | "/" (全站) |
| domain | 生效域名,預設當前主機 | ".example.com" (含子域) |
| secure | 僅 HTTPS 傳輸 | true |
| httponly | JS 無法讀取 (防 XSS) | true |
設定範例
<?php
setcookie("mycookie", "value_of_mycookie"); // 簡單
setcookie("withExpire", "Expire_in_1_hour", time()+3600); // 帶過期
setcookie("FullCookie", "value", time()+3600, "/forum", "www.123.com", true, true); // 完整參數
?>
二、重要特性與注意事項
- 設定順序:同頁面多個
setcookie 按「後蓋前」生效,刪除後重設需先寫入再刪除代碼順序
- 路徑隔離:
/admin/ 設定的 Cookie 在 /public/ 不可見
- 輸出前設定:必須在任何 HTML/空白輸出前呼叫
- 瀏覽器限制:單域名約 150-180 個、單 Cookie 4KB、用戶可禁用
三、接收與處理
PHP 自動解析至 $_COOKIE 超全域陣列:
<?php
echo $_COOKIE['mycookie']; // 直接讀取
echo $HTTP_COOKIE_VARS['mycookie']; // 舊式寫法 (PHP 5.4+ 移除)
echo count($_COOKIE); // Cookie 總數
?>
四、刪除 Cookie
<?php
// 方法 1:僅帶 name
setcookie("mycookie");
// 方法 2:過期時間設為過去
setcookie("mycookie", "", time()-1);
// 或
setcookie("mycookie", "", time()-3600);
?>
五、完整實戰範例
<?php
// cookie.php
if (!isset($_GET['flag'])) {
setcookie("mycookie", "this my cookie!");
header("Location: cookie.php?flag=1"); // 重導向觸發瀏覽器攜帶 Cookie
exit;
}
?>
<html><body>
<?php echo "Cookie 值: " . $_COOKIE['mycookie']; ?>
</body></html>
六、安全最佳實踐
| 風險 | 防護措施 |
| XSS 竊取 Cookie | 啟用 httponly=true,內容安全策略 (CSP) |
| 中間人竊聽 | 全站 HTTPS + secure=true + HSTS |
| CSRF 攻擊 | SameSite=Lax/Strict (PHP 7.3+ setcookie(..., ['samesite'=>'Lax'])) |
| Session 劫持 | Session ID 定期重生成、IP/UA 綁定檢查 |
七、現代框架封裝 (Laravel/Symfony 風格)
<?php
// 設定
Cookie::queue('name', 'value', 60); // 隊列化,響應階段寫入
Cookie::forever('remember_token', $token); // 5 年過期
// 讀取
$value = Cookie::get('name');
$value = request()->cookie('name');
// 刪除
Cookie::forget('name');
Cookie::expire('name');
?>
- 上一篇文章: PHP 陣列完整使用指南:宣告、類型、遍歷、統計、排序與多維陣列
- 下一篇文章: PHPCMS 架構載入流程分析與優缺點評價
Copyright ©
程式碼之家 All Rights Reserved