核心代碼(已修復原始碼語法錯誤)
<?php
// 1. 設定正確的 Content-Type 與編碼
header('Content-Type: text/html; charset=utf-8');
$cookieName = 'visit_time';
$now = date('Y-m-d H:i:s');
// 2. 判斷 Cookie 是否存在
if (!isset($_COOKIE[$cookieName])) {
// 首次訪問:設定 Cookie(預設 session 級,瀏覽器關閉失效)
setcookie($cookieName, $now);
echo "歡迎你第一次訪問網站!<br>";
} else {
// 再次訪問:讀取上次時間,並更新 Cookie(有效期 60 秒,演示用)
$lastVisit = htmlspecialchars($_COOKIE[$cookieName], ENT_QUOTES, 'UTF-8');
setcookie($cookieName, $now, time() + 60); // 修復:原碼漏掉 '+'
echo "你上次訪問網站的時間為:{$lastVisit}<br>";
}
// 3. 顯示本次訪問時間
echo "你本次訪問網站的時間為:{$now}";
關鍵細節深度解析
1. setcookie() 參數陷阱
setcookie(string $name, string $value = "", int $expires_or_options = 0,
string $path = "", string $domain = "", bool $secure = false, bool $httponly = false)
- expires:
time() + 60 表示 60 秒後過期。原始碼寫成 time() 60 會導致語法錯誤。
- path:預設為當前腳本目錄,建議明確設定
'/' 全站可用。
- httponly:設為
true 防止 JavaScript 竊取(防 XSS)。
- secure:HTTPS 環境下必須設
true,否則 Cookie 不發送。
2. Cookie vs Session 選型
| 特性 | Cookie | Session |
| 存儲位置 | 客戶端瀏覽器 | 伺服器端 (文件/Redis/DB) |
| 容量限制 | 單個 4KB,域名下約 20-50 個 | 受伺服器記憶體/磁碟限制,較大 |
| 安全性 | 可被竄改/竊取,需簽名/加密 | 相對安全,ID 傳輸仍需防固定 |
| 適用場景 | 記憶偏好、追蹤、輕量狀態 | 登入態、購物車、敏感業務數據 |
本例屬「輕量追蹤」,Cookie 足夠;若涉及用戶身份,請改用 Session + CSRF 保護。
3. 安全加固建議
- 輸出轉義:
htmlspecialchars() 防止 Cookie 值注入 XSS(雖本例由伺服器寫入,但防禦性編程必備)。
- 簽名驗證:
hash_hmac('sha256', $value, $secret) 防止用戶端竄改時間。
- 加密存儲:敏感資訊用
openssl_encrypt (AES-256-GCM) 加密後再寫入 Cookie。
- SameSite 屬性:PHP 7.3+
setcookie(..., ['samesite' => 'Lax']) 防禦 CSRF。
進階版:記錄最近 5 次訪問時間(陣列序列化)
$maxRecords = 5;
$cookieName = 'visit_history';
$history = isset($_COOKIE[$cookieName]) ? json_decode($_COOKIE[$cookieName], true) : [];
if (!is_array($history)) $history = [];
$now = date('c'); // ISO 8601 格式,利於排序/解析
array_unshift($history, $now);
$history = array_slice($history, 0, $maxRecords);
setcookie($cookieName, json_encode($history), time() + 86400 * 30, '/', '', true, true);
// httponly=true, secure=true (需 HTTPS)
echo "最近訪問記錄:<br>";
foreach ($history as $i => $t) {
echo ($i+1) . ". " . date('Y-m-d H:i:s', strtotime($t)) . "<br>";
}
總結
Cookie 是 HTTP 無狀態協議中維持「微量狀態」的基石。掌握 setcookie 完整參數、輸出轉義、安全屬性,能讓你輕鬆實現「記住我」、「最近瀏覽」、「首次引導」等常見功能,同時守住安全底線。
- 上一篇文章: PHP 實用工具函數:從二維對象陣列提取鍵值對生成一維陣列
- 下一篇文章: PHP 修改 php.ini 設定檔上傳大小完整教學
Copyright ©
程式碼之家 All Rights Reserved