萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP setcookie() 函數詳解:Cookie 設定、讀取與安全最佳實踐

Cookie 基本概念

Cookie 是伺服器發送至瀏覽器的小型文字資料,瀏覽器會在後續請求中自動攜帶。PHP 透過 setcookie() 發送 Set-Cookie HTTP 標頭,**必須在任何輸出之前呼叫**(含空白、BOM、HTML)。

語法與參數

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

PHP 7.3+ 支援陣列選項寫法:

setcookie(string $name, string $value = "", array $options = []): bool
參數說明
nameCookie 名稱(必填),自動建立同名變數 $_COOKIE['name']
valueCookie 值,自動 URL 編碼/解碼
expires_or_options過期時間(Unix 時間戳),0=瀏覽器關閉失效;或選項陣列
path生效路徑,/ 為全域,/admin/ 僅限該目錄
domain生效網域,.example.com 包含所有子網域
securetrue 僅 HTTPS 傳輸
httponlytrue 禁止 JavaScript 存取(防 XSS)

選項陣列寫法 (PHP 7.3+)

<?php
setcookie('user_pref', 'dark_mode', [
    'expires'  => time() + 86400 * 30,  // 30 天
    'path'     => '/',
    'domain'   => '.example.com',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax',  // CSRF 防護:Lax/Strict/None
]);
?>

實戰範例

基本設定(Session Cookie)

<?php
setcookie("TestCookie", "my cookie value");
?>

設定 24 小時過期

<?php
setcookie("TestCookie", "my cookie value", time() + 3600 * 24);
?>

刪除 Cookie

<?php
// 設定過期時間為過去
setcookie("TestCookie", "", time() - 3600);
// 或 PHP 7.3+
setcookie("TestCookie", "", ['expires' => time() - 3600]);
?>

讀取 Cookie

<?php
// 當前請求無法立即讀取剛設定的 Cookie,需下一次請求
if (isset($_COOKIE['TestCookie'])) {
    echo $_COOKIE['TestCookie'];
}
?>

安全最佳實踐

  1. 永遠啟用 httponly:防止 XSS 竊取 Cookie。
  2. HTTPS 環境啟用 secure:避免明文傳輸。
  3. 設定 SameSite:Lax 兼顧安全與體驗,Strict 最嚴格,None 需配合 secure。
  4. 最小化權限:path、domain 僅設必要範圍。
  5. 敏感資料勿存 Cookie:Token、ID 等改用 Session 或加密儲存。
  6. 驗證 Cookie 完整性:簽名或加密(如 Laravel 加密 Cookie)。

常見問題排查

  • 無法設定:檢查是否有輸出(含 BOM、錯誤訊息),使用 ob_start() 緩衝輸出。
  • 跨子網域共享:設定 domain=.example.com(前綴點號)。
  • 刪除不生效:確保 path、domain、secure、httponly 與設定時完全一致。

Cookie 是 HTTP 無狀態特性的關鍵補充,正確設定與安全配置是 Web 開發必備功力。

copyright © 萬盛學電腦網 all rights reserved