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

CodeIgniter Cookie 操作完整教學:Helper 類庫封裝與最佳實踐

     編輯:PHP 綜合知識

CI 操作 Cookie 三種方式

  1. 原生 setcookie() / $_COOKIE
  2. CI Input 類別:$this->input->set_cookie() / $this->input->cookie()
  3. Cookie Helper(推薦):set_cookie() / get_cookie() / delete_cookie()

Cookie Helper 使用步驟

1. 載入 Helper

$this->load->helper('cookie');

2. 設定 Cookie

set_cookie('cookie_name', 'cookie_value', 86400); // 過期時間:秒數(86400=1天)

完整參數:set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure, $httponly)

3. 讀取 Cookie

$value = get_cookie('cookie_name'); // 不存在回傳空字串

4. 刪除 Cookie

delete_cookie('cookie_name');

封裝至基底控制器(MY_Controller)

將常用操作封裝為父類別方法,所有控制器繼承即可複用:

class MY_Controller extends CI_Controller {
    public function __construct() {
        parent::__construct();
        $this->load->helper('cookie');
    }

    // 設定加密 Cookie(建議儲存敏感資料時使用)
    protected function setSecureCookie($name, $value, $expire = 86400) {
        $config = &get_config();
        $value = $this->encrypt->encode($value); // 需載入 encrypt 類別並設定 encryption_key
        set_cookie($name, $value, $expire, $config['cookie_domain'], $config['cookie_path'], $config['cookie_prefix'], true, true);
    }

    // 讀取並解密
    protected function getSecureCookie($name) {
        $value = get_cookie($name);
        if ($value) {
            return $this->encrypt->decode($value);
        }
        return false;
    }

    // 一般 Cookie
    protected function setCookie($name, $value, $expire = 86400) {
        set_cookie($name, $value, $expire);
    }

    protected function getCookie($name) {
        return get_cookie($name);
    }

    protected function deleteCookie($name) {
        delete_cookie($name);
    }
}

控制器中使用範例

class Welcome extends MY_Controller {
    public function login() {
        // 驗證成功後
        $userData = ['id' => 123, 'username' => 'john', 'role' => 'admin'];
        $this->setSecureCookie('user_session', json_encode($userData), 3600); // 1小時
        redirect('dashboard');
    }

    public function dashboard() {
        $session = $this->getSecureCookie('user_session');
        if (!$session) {
            redirect('login');
        }
        $user = json_decode($session, true);
        $this->load->view('dashboard', ['user' => $user]);
    }

    public function logout() {
        $this->deleteCookie('user_session');
        redirect('login');
    }
}

config.php 相關設定

$config['cookie_prefix']   = 'myapp_';     // 避免與其他應用衝突
$config['cookie_domain']   = '';           // 跨子域名共享可設 '.example.com'
$config['cookie_path']     = '/';          // 整站可用
$config['cookie_secure']   = false;        // 僅 HTTPS 傳輸設 true(需 SSL)
$config['cookie_httponly'] = true;         // 防止 JS 存取(XSS 防護)
$config['encryption_key']  = 'your_32_char_random_key'; // 加密金鑰
$config['sess_driver']     = 'files';      // Session 驅動(與 Cookie 區分)

Cookie vs Session 選擇指南

特性CookieSession
儲存位置客戶端瀏覽器伺服器(檔案/資料庫/Redis/Memcached)
容量限制約 4KB / 個較大(受伺服器儲存限制)
安全性可被竄改、攔截、XSS 竊取資料不暴露給客戶端,較安全
跨網域支援(設定 domain)需共享 Session 儲存體
適用場景記住登入、偏好設定、追蹤 ID使用者狀態、權限、購物車、敏感資料

安全最佳實踐

  1. HttpOnly:cookie_httponly=true 防止 XSS 竊取。
  2. Secure:HTTPS 環境強制 cookie_secure=true。
  3. SameSite:CI 3.1.10+ 支援 set_cookie(..., '', '', '', '', '', true, true, 'Lax') 防禦 CSRF。
  4. 加密敏感資料:Cookie 儲存用戶 ID、權限等必須加密。
  5. 最小權限原則:cookie_path 限制在必要路徑、cookie_domain 不要設為主域名除非必要。
  6. 定期輪換:重要 Cookie 設定較短過期時間,配合伺服端驗證機制。

常見問題排查

  • Cookie 讀不到:檢查 domain/path 設定、瀏覽器是否封鎖第三方 Cookie、是否在輸出前設定。
  • 中文亂碼:Cookie 值建議 urlencode() 儲存、urldecode() 讀取,或用 JSON 編碼。
  • 跨子域名不共享:確認 cookie_domain='.example.com'(前綴點號)。
  • 加密解密失敗:encryption_key 必須固定、長度足夠、全站一致。

善用 Cookie Helper 並封裝至基底控制器,能統一管理 Cookie 策略、提升安全性與開發效率。

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