CI 三種 Cookie 操作方式對比
| 方式 | 類別 | 特點 |
| Input 類 | $this->input->cookie() | 僅讀取,自動過濾 XSS,不支援寫入 |
| Response 類 (CI3+) | $this->response->set_cookie() | 物件導向,支援 SameSite、HttpOnly、Secure 完整屬性 |
| Cookie Helper | set_cookie()/get_cookie() | 函數式,輕量,舊專案常用,本文重點介紹 |
Cookie Helper 基礎用法
$this->load->helper('cookie');
// 寫入
set_cookie('user_id', 12345, 86400); // 名稱、值、過期秒數
// 完整參數
set_cookie([
'name' => 'token',
'value' => 'abc123',
'expire' => 3600,
'domain' => '.example.com',
'path' => '/',
'prefix' => 'app_',
'secure' => TRUE, // 僅 HTTPS
'httponly' => TRUE, // JS 不可讀
'samesite' => 'Lax' // CI 3.1.10+
]);
// 讀取
$uid = get_cookie('user_id'); // 自動處理 prefix
// 刪除
delete_cookie('user_id'); // 實際設定 expire 為過去時間
基類控制器封裝統一介面
class MY_Controller extends CI_Controller {
protected function saveCookie($name, $value, $expire = 86400) {
$this->load->helper('cookie');
set_cookie($name, $value, $expire);
}
protected function getCookie($name) {
$this->load->helper('cookie');
return get_cookie($name);
}
protected function delCookie($name) {
$this->load->helper('cookie');
delete_cookie($name);
}
}
// 子類使用
class Auth extends MY_Controller {
public function login() {
// 驗證通過後
$this->saveCookie('user_info', json_encode($user), 3600*24*7);
redirect('dashboard');
}
public function dashboard() {
$user = json_decode($this->getCookie('user_info'), true);
if (!$user) redirect('login');
$this->load->view('dashboard', ['user' => $user]);
}
}
生產環境安全加固清單
- 全站 HTTPS + Secure 標記:
$config['cookie_secure'] = TRUE; (CI3 配置文件)
- HttpOnly 防 XSS:
$config['cookie_httponly'] = TRUE;
3. SameSite=Lax/Strict:防禦 CSRF,CI 3.1.10+ 原生支援
4. 域名範圍最小化:$config['cookie_domain'] = '.example.com'; 避免子域名洩露
5. 前綴隔離:$config['cookie_prefix'] = 'app_'; 多系統共域名時避免衝突
6. 敏感數據加密:Cookie 值建議用 openssl_encrypt 或 CI encryption 加密存儲
常見問題排查
| 現象 | 原因 | 解決 |
| get_cookie 返回空 | 域名/路徑/前綴不匹配 | 檢查瀏覽器開發工具 Application → Cookies 實際屬性 |
| Ajax 請求不攜帶 Cookie | 跨域未設 withCredentials: true 或 SameSite=Strict | 前端 xhrFields: {withCredentials: true},後端 SameSite=Lax |
| 刪除後仍存在 | 路徑/域名不一致導致瀏覽器不識別為同一 Cookie | delete_cookie 時傳遞相同 path/domain/prefix |
統一封裝至基類、配置安全屬性、善用瀏覽器開發工具調試,是 CI 專案 Cookie 管理的標準化路徑。