主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

PHP Cookie

Cookie 是网站为了识别用户身份、记录用户偏好或跟踪用户行为而存储在用户浏览器中的小型文本数据片段。作为 HTTP 协议的重要组成部分,Cookie 能够在用户访问同一网站时被读取,从而实现状态保持和个性化服务等功能。

PHP 主要通过setcookie()函数和$_COOKIE超全局数组来操作 Cookie。


Cookie 基础设置方法

1. 简单 Cookie

// 设置一个 1 小时后过期的 Cookie
setcookie("domain", "www.kaicz.com", time() + 3600);

✅ 参数说明:

  • 第1参数:Cookie 名称(字符串)
  • 第2参数:值(自动 URL 编码,空格转+
  • 第3参数:过期时间(Unix 时间戳,如果省略浏览器关闭自动过期)

2. 使用 setrawcookie()(不自动编码)

// 值中包含特殊字符时使用
setrawcookie("domain", "www.kaicz.com", time() + 3600);

Cookie 完整参数设置(PHP 7.3+ 推荐写法)

setcookie('prefs', 'dark_mode', [
    'expires'  => time() + 86400, // 1天后过期
    'path'     => '/',           // 全站有效
    'domain'   => '.kaicz.com', // 子域名共享
    'secure'   => true,          // 仅 HTTPS 传输
    'httponly' => true,          // 禁止 JS 访问
    'samesite' => 'Lax'          // 防 CSRF
]);

✅ 参数详解:

参数 说明
expires 过期时间戳(0 = 会话Cookie,浏览器关闭后失效)
path Cookie 有效的服务器路径(/ 表示全站)
domain 生效域名(.kaicz.com 允许子域名共享)
secure true 时仅通过 HTTPS 传输
httponly true 时 JavaScript 无法读取(防 XSS)
samesite Strict/Lax/None(控制跨站请求携带 Cookie,默认 Lax

读取 Cookie

// 检查 Cookie 是否存在
if (isset($_COOKIE['username'])) {
    echo "欢迎回来," . $_COOKIE['username'];
} else {
    echo "您好,访客!";
}

// 查看所有 Cookie
print_r($_COOKIE);

删除 Cookie

// 1. 使浏览器端 Cookie 过期
setcookie('user_token', '', time() - 3600, '/');

// 2. 立即移除当前脚本中的值(可选)
unset($_COOKIE['user_token']);

数组 Cookie

// 设置数组
setcookie('user[theme]', 'dark');
setcookie('user[font]', 'Arial');

// 读取时会自动解析为数组
echo $_COOKIE['user']['theme']; // 输出 "dark"

Cookie 安全性

1. 敏感数据加密

可以使用OpenSSL进行AES-256-CBC加密,来保证 Cookie 数据的不被他人读取

$encrypted = openssl_encrypt('data', 'AES-256-CBC', $secret_key);
setcookie('secure_data', $encrypted, ['httponly' => true]);

2. 签名防篡改

Cookie 签名防篡改指在 Cookie 内容中加入加密签名,用于验证 Cookie 是否被篡改。

$value = 'user123';
$signature = hash_hmac('sha256', $value, $secret_key);
setcookie('user', $value, ['httponly' => true]);
setcookie('user_sig', $signature, ['httponly' => true]);

// 验证代码
if (hash_hmac('sha256', $_COOKIE['user'], $secret_key) !== $_COOKIE['user_sig']) {
    die('Cookie 被篡改!');

3. 限制 Cookie 作用域

通过设置pathdomain参数,可以限制 Cookie 的作用域,防止跨站访问。

// 仅允许 /admin 路径访问
setcookie('admin_token', 'xxx', ['path' => '/admin/']);

// 仅限特定子域名
setcookie('sub_token', 'xxx', ['domain' => 'api.example.com']);


评论区 0
发表评论