原来PHP是这样用Cookie的?

0 阅读2分钟

原来PHP是这样用Cookie的?

在 Web 开发中,HTTP 是无状态的协议 —— 服务器无法记住 “你是谁”。

而 Cookie 正是解决这个问题的核心手段:记住登录状态、保存用户偏好、跟踪用户行为…… 这些高频需求都离不开 Cookie。

Cookie 基础:什么是 Cookie?

Cookie 是服务器发送给浏览器的一小段文本信息(通常 ≤4KB),浏览器会将其保存在本地。当用户再次访问同一网站时,浏览器会自动把 Cookie 附带在请求中发送给服务器,从而让服务器 “认出” 用户。

简单理解:Cookie 就像服务器给用户发的 “临时身份证”,下次访问时出示即可。


常用方法

设置 Cookie(setcookie()

PHP 中使用 setcookie() 函数设置 Cookie,必须在任何输出(包括 HTML 标签、空格、换行)之前调用,否则会报错。

setcookie(
    string $name,           // Cookie 名称(必填)
    string $value = "",     // Cookie 值(可选,空则删除)
    int $expires = 0,       // 有效期(时间戳,0=关闭浏览器失效)
    string $path = "",      // 作用路径(空=当前目录)
    string $domain = "",    // 作用域名(空=当前域名)
    bool $secure = false,   // 是否仅 HTTPS 传输
    bool $httponly = false  // 是否仅 HTTP 访问(禁止 JS 读取)
): bool

有效期($expires):

  • 0(默认):会话 Cookie,关闭浏览器后立即失效。
  • time() + 秒数持久 Cookie,指定时间后失效。

作用路径($path): 控制 Cookie 在哪些目录下可用

  • ""(默认):仅当前目录及其子目录可用。
  • "/"全站可用(最常用)。
  • "/admin":仅 /admin 目录及其子目录可用。

作用域名($domain): 控制 Cookie 在哪些域名下可用

  • ""(默认):仅当前域名可用(如 www.example.com)。
  • ".example.com"主域名及所有子域名可用(如 www.example.comadmin.example.com)。

安全参数($secure$httponly): 生产环境强烈建议开启

  • $secure = true:仅在 HTTPS 协议下传输 Cookie,防止明文被窃取。
  • $httponly = true:禁止 JavaScript 读取 Cookie(通过 document.cookie),有效防止 XSS 攻击窃取 Cookie。

读取 Cookie:$_COOKIE 超全局变量

Cookie 设置后,下次请求时 PHP 会自动将其解析到 $_COOKIE 数组中,我们可以直接读取。

// 先判断 Cookie 是否存在
if (isset($_COOKIE['username'])) {
    $username = $_COOKIE['username'];
    echo "欢迎回来," . htmlspecialchars($username) . "!";
}

删除 Cookie

删除 Cookie 的原理是将其有效期设置为过去的时间,让浏览器自动失效。

// 方法 1:将有效期设为过去(推荐,最稳妥)
setcookie("username", "", time() - 3600);

// 方法 2:不设置值,只设过期时间
setcookie("username");

echo "Cookie 已删除";

对 Cookie 内容进行签名 :防止用户篡改 Cookie 值。

hash_hmac() 生成签名,验证时比对

// 设置时签名
$value = "user_id_1";
$secret = "your_secret_key"; // 服务器端密钥
$signature = hash_hmac('sha256', $value, $secret);
setcookie("user", $value . "|" . $signature, time() + 3600);

// 读取时验证
if (isset($_COOKIE['user'])) {
    list($value, $sig) = explode("|", $_COOKIE['user'], 2);
    if (hash_hmac('sha256', $value, $secret) === $sig) {
        // 验证通过,Cookie 未被篡改
        echo "有效用户:" . $value;
    } else {
        echo "Cookie 被篡改!";
    }
}