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

PHP setcookie() 完整參數解析與實戰應用指南

     編輯:PHP 相關知識

Cookie 是 HTTP 協議中維持狀態的關鍵機制。PHP setcookie() 函數用於定義並隨 HTTP 標頭一同發送 Cookie。由於協議限制,**Cookie 必須在任何輸出(包含 HTML 標籤、空白字元)之前發送**,否則函數會失敗回傳 FALSE。

一、函數原型與參數詳解

bool setcookie (
    string $name,
    string $value = "",
    int $expire = 0,
    string $path = "",
    string $domain = "",
    bool $secure = false,
    bool $httponly = false  // PHP 5.2.0+ 新增
)
參數說明範例 / 備註
name Cookie 名稱 透過 $_COOKIE['cookiename'] 讀取
value Cookie 值(儲存在客戶端) 切勿存放敏感資料(密碼、Token 等)
expire 過期時間(Unix 時間戳) time() + 3600 = 1 小時後過期;0 或省略 = 瀏覽器關閉即失效(Session Cookie)
path 伺服器端有效路徑 / = 整個網域有效;/foo/ = 僅 /foo/ 及子目錄有效;預設為當前目錄
domain 有效網域 .example.com = 所有子網域有效(建議加前導點以相容更多瀏覽器);www.example.com = 僅 www 子網域
secure 僅 HTTPS 傳輸 true = 只在安全連線發送;預設 false
httponly 禁止 JavaScript 存取 true 可緩解 XSS 攻擊風險(PHP 5.2.0+ 支援)

二、常見用法範例

1. 基礎設定

$value = 'something from somewhere';
setcookie('TestCookie', $value);                           // Session Cookie
setcookie('TestCookie', $value, time() + 3600);            // 1 小時後過期
setcookie('TestCookie', $value, time() + 3600, '/~rasmus/', '.utoronto.ca', 1); // 完整參數

2. 讀取 Cookie

echo $_COOKIE['TestCookie'];
echo $HTTP_COOKIE_VARS['TestCookie']; // 老版本相容
print_r($_COOKIE); // 除錯:列出所有 Cookie

3. 刪除 Cookie

將過期時間設為過去時間點,觸發瀏覽器刪除機制:

setcookie('TestCookie', '', time() - 3600);
setcookie('TestCookie', '', time() - 3600, '/~rasmus/', '.utoronto.ca', 1);

4. 陣列式 Cookie

利用名稱中的方括號語法,可一次設定多個關聯值:

setcookie('cookie[three]', 'cookiethree');
setcookie('cookie[two]', 'cookietwo');
setcookie('cookie[one]', 'cookieone');

// 讀取時自動轉為陣列
if (isset($_COOKIE['cookie'])) {
    foreach ($_COOKIE['cookie'] as $name => $value) {
        echo "$name : $value 
"; } } /* 輸出: three : cookiethree two : cookietwo one : cookieone */

三、進階注意事項

1. 自動編碼與解碼

Cookie 值在發送時會自動 urlencode,接收時自動 urldecode。若不想要此行為(PHP 5+),可改用 setrawcookie()。

2. 路徑與網域的最佳實踐

  • path 設為 /:確保整站共用同一 Cookie,避免子目錄下無法讀取。
  • domain 加前導點:.example.com 相容性優於 example.com,涵蓋所有子網域。
  • 跨子網域共用:主網域設定 domain=.example.com,子網域即可讀取。

3. 安全性加強建議

  • 敏感操作的 Cookie **務必啟用 secure=true 與 httponly=true**。
  • 考慮加入 SameSite 屬性(PHP 7.3+ 支援 setcookie() 第 7 參數或透過 header() 手動設定)防禦 CSRF。
  • Cookie 值若包含結構化資料,建議序列化(JSON)並簽名驗證,防止竄改。

四、常見錯誤排查

現象可能原因解決方案
setcookie() 回傳 false函數呼叫前已有輸出(echo、空白、BOM)確保腳本最開頭呼叫,或啟用 output_buffering
跨子網域無法讀取domain 參數未正確設定設定 domain=.example.com 並確認 path 為 /
HTTPS 頁面 Cookie 遺失secure 參數設為 true 但頁面為 HTTP僅在 HTTPS 環境啟用 secure,或區分環境設定
JavaScript 讀不到 Cookiehttponly 設為 true若前端確實需要存取,設為 false 並評估 XSS 風險

五、總結

Cookie 基礎用法不難,關鍵在於精準掌握 path 路徑與 domain 網域設定,並根據安全需求啟用 secure、httponly、SameSite 等屬性。建議將 Cookie 相關邏輯封裝為工具類,統一管理專案中的 Cookie 策略,減少人為錯誤。

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