PHP cookies如何安全保存参数?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 参数 正文

什么是 Cookie?

Cookie 是一种在客户端(用户浏览器)上存储的小型文本文件,当用户访问一个网站时,服务器可以要求浏览器将一些数据存储在用户的计算机上,之后,当用户再次访问该网站时,浏览器会自动将这些数据发送回服务器。

php cookies保存参数
(图片来源网络,侵删)

主要用途:

  • 记住用户登录状态 (Session ID)
  • 保存用户偏好设置 (如语言、主题)
  • 跟踪用户行为 (用于分析)
  • (在小型应用中)

设置 Cookie (保存参数)

在 PHP 中,使用 setcookie() 函数来设置一个 Cookie。

setcookie() 函数语法

setcookie(
    string $name,
    string $value = "",
    int $expires_or_options = 0,
    string $path = "",
    string $domain = "",
    bool $secure = false,
    bool $httponly = false
): bool

参数详解

参数 描述 示例
$name Cookie 的名称 (必需),这是一个字符串,用于标识 Cookie。 "username"
$value Cookie 的值 (可选),存储在 Cookie 中的数据。注意: 值会被自动 URL 编码。 "john_doe"
$expires_or_options 过期时间 (可选),这是一个 Unix 时间戳(自1970年1月1日以来的秒数),表示 Cookie 的有效期,如果设置为 0,或者在 PHP 7.3.0 之前没有提供,Cookie 会在会话结束时(即浏览器关闭时)失效。 time() + 3600 (表示1小时后过期)
$path 服务器路径 (可选),指定 Cookie 在服务器的哪个路径下有效。 表示在整个域名下都有效,"/blog/" 表示只在 /blog/ 目录及其子目录下有效。
$domain 域名 (可选),指定 Cookie 对哪个域名有效。".example.com" 会在 www.example.commail.example.com 下都有效。 ".yourdomain.com"
$secure 仅 HTTPS (可选),设置为 true 时,Cookie 只能通过 HTTPS 连接发送,增加了安全性。强烈推荐在生产环境中使用。 true
$httponly 仅 HTTP (可选),设置为 true 时,Cookie 将无法通过 JavaScript 的 document.cookie API 访问,这有助于防止跨站脚本攻击窃取 Cookie。强烈推荐设置为 true true

设置 Cookie 的示例

示例 1:设置一个会话 Cookie (浏览器关闭后失效)

<?php
// 设置一个名为 "user_language" 的 Cookie,值为 "zh-CN"
// 它将在当前目录及其子目录下有效
setcookie("user_language", "zh-CN");
?>

示例 2:设置一个有有效期的 Cookie (保存7天)

php cookies保存参数
(图片来源网络,侵删)
<?php
// 设置一个名为 "username" 的 Cookie,值为 "Alice",有效期7天
// 在整个域名下有效,且仅通过 HTTPS 发送,禁止 JavaScript 访问
$cookie_name = "username";
$cookie_value = "Alice";
$expiry_time = time() + (86400 * 7); // 86400 秒 = 1天
setcookie($cookie_name, $cookie_value, $expiry_time, "/", "", true, true);
?>

重要提示:

  • setcookie() 必须在 <html> 标签之前 调用,任何在它之前输出的内容(如空格、HTML 标签)都会导致设置失败。
  • 设置 Cookie 后,它不会在同一脚本中立即可用,它会在下一次页面加载时,通过 $_COOKIE 超全局变量可用。

读取 Cookie (获取参数)

当 Cookie 成功设置并被发送到客户端后,在后续的页面请求中,PHP 会自动将这些 Cookie 数据存放在 $_COOKIE 超全局数组中。

$_COOKIE 读取数据

<?php
// 检查 Cookie "user_language" 是否存在
if(isset($_COOKIE["user_language"])) {
    $language = $_COOKIE["user_language"];
    echo "您的语言偏好是: " . htmlspecialchars($language);
} else {
    echo "Cookie 'user_language' 未设置。";
}
?>

安全最佳实践: 始终使用 htmlspecialchars() 函数输出从 Cookie 或其他用户输入中获取的数据,以防止跨站脚本攻击。


删除 Cookie

在 PHP 中,没有专门的“删除”Cookie 函数,删除一个 Cookie 的方法是重新设置它,并将其过期时间设置为一个过去的时间

php cookies保存参数
(图片来源网络,侵删)

删除 Cookie 的示例

<?php
// 要删除的 Cookie 名称
$cookie_name = "username";
// 设置过期时间为1小时前
$expiry_time = time() - 3600;
// 重新设置 Cookie,使其过期
// 参数需要与创建时保持一致(name, value, expires, path, domain, secure, httponly)
setcookie($cookie_name, "", $expiry_time, "/", "", true, true);
echo "Cookie '" . $cookie_name . "' 已删除。";
?>

注意: 删除操作也需要在 <html> 标签之前执行。


完整示例:设置、读取和删除

这是一个简单的、可运行的示例,展示了完整的生命周期。

文件 1: set_cookie.php (设置 Cookie)

<?php
// 设置一个欢迎消息的 Cookie,有效期1小时
$welcome_cookie_name = "welcome_message";
$welcome_cookie_value = "欢迎回来!这是您第 N 次访问。";
$expiry_time = time() + 3600; // 1小时后过期
// 尝试设置 Cookie
if (setcookie($welcome_cookie_name, $welcome_cookie_value, $expiry_time, "/")) {
    echo "Cookie '" . $welcome_cookie_name . "' 设置成功!<br>";
} else {
    echo "设置 Cookie 失败,请检查是否在 <html> 标签之前调用。";
}
?>
<p>
    <a href="read_cookie.php">点击这里去读取 Cookie</a>
</p>

文件 2: read_cookie.php (读取 Cookie)

<?php
// 在页面顶部检查 Cookie
if (isset($_COOKIE["welcome_message"])) {
    $message = $_COOKIE["welcome_message"];
    echo "从 Cookie 中读取到消息: " . htmlspecialchars($message) . "<br>";
} else {
    echo "Cookie 'welcome_message' 不存在或已过期。<br>";
}
?>
<p>
    <a href="delete_cookie.php">点击这里删除 Cookie</a>
</p>

文件 3: delete_cookie.php (删除 Cookie)

<?php
// 要删除的 Cookie 名称
$cookie_name = "welcome_message";
// 设置过期时间为1小时前
$expiry_time = time() - 3600;
// 重新设置 Cookie 以删除它
setcookie($cookie_name, "", $expiry_time, "/");
echo "Cookie '" . $cookie_name . "' 已尝试删除。<br>";
echo "<a href='read_cookie.php'>点击这里验证 Cookie 是否已被删除</a>";
?>

总结与最佳实践

  1. 尽早设置setcookie() 必须在任何 HTML 输出之前调用。
  2. 安全性
    • 始终为 Cookie 设置 httponlysecure (如果使用 HTTPS) 标志。
    • 对从 $_COOKIE 读取的任何数据进行转义(如 htmlspecialchars())。
  3. 数据量:Cookie 的大小通常限制在 4KB 左右,不要存储大量数据。
  4. 敏感信息切勿在 Cookie 中存储密码、信用卡号等敏感信息,对于敏感数据,应使用 Session,并将 Session ID 存储在 Cookie 中。
  5. 过期时间:为 Cookie 设置合理的过期时间,避免用户离开后数据长期留存。
  6. 路径和域名:根据需要精确设置 $path$domain,以增强安全性和避免不必要的 Cookie 发送。
-- 展开阅读全文 --
头像
Oculus Rift硬件参数具体有哪些亮点?
« 上一篇 今天
智能云电视功能多,具体有哪些实用亮点?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]