PHP设置与获取Cookie的完整教程
本文深入解析了PHP中Cookie的设置与获取方法,重点讲解了`setcookie()`函数的使用,包括有效期、路径、域名等关键参数的设置,以及如何通过`$_COOKIE`数组获取Cookie值。同时,文章强调了Cookie的安全性问题,详细阐述了如何利用`httponly`、`samesite`等属性防御XSS和CSRF攻击,并建议使用HTTPS保障数据传输安全。此外,文章还对比了Cookie与Session的适用场景,建议敏感数据存储在Session中。掌握这些技巧,能有效提升PHP网站的安全性与用户体验。
PHP通过setcookie()设置Cookie,$_COOKIE获取,需关注有效期、路径、域及安全属性;httponly防XSS,samesite防CSRF,secure确保HTTPS传输,Session存敏感数据更安全,二者常结合使用。

PHP操作Cookie主要通过setcookie()函数来设置,并通过全局变量$_COOKIE数组来获取。这是一种在用户浏览器端存储少量数据,实现状态保持的常见机制,它让服务器能够“记住”用户的某些信息,从而提供更个性化或连续的体验。
PHP中设置Cookie的核心是setcookie()函数。它的基本用法很简单,比如你要设置一个名为user_id,值为123的Cookie,你可以这么写:setcookie("user_id", "123");。但通常,我们还需要考虑它的生命周期、作用域和安全性。一个更完整的设置可能像这样:
<?php
// 设置一个名为 'username',值为 'john_doe' 的Cookie
// 有效期为1小时 (3600秒),即当前时间戳 + 3600秒
// 作用路径为整个网站 (/)
// 作用域为当前域名 (留空或设置为''表示当前域名)
// 仅通过HTTPS传输 (true),在生产环境强烈推荐
// 仅HTTP请求可访问,JS无法访问 (true),有效防止XSS攻击
// SameSite属性设置为'Lax',有助于防止CSRF攻击 (PHP 7.3+ 支持)
setcookie("username", "john_doe", [
'expires' => time() + 3600,
'path' => '/',
'domain' => '',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax'
]);
// 获取Cookie
// 注意:setcookie()调用后,当前请求周期内$_COOKIE中不会立即出现新设置的Cookie。
// 它会在下一次请求时,浏览器将Cookie发送回来后,才在$_COOKIE中可用。
if (isset($_COOKIE['username'])) {
echo "欢迎回来," . htmlspecialchars($_COOKIE['username']) . "!";
} else {
echo "您是新用户或Cookie已过期。";
}
// 更新Cookie实际上就是用相同的名字再次调用setcookie(),并传入新的值或参数。
// 比如,更新username的有效期至2小时:
// setcookie("username", "john_doe", ['expires' => time() + 7200, 'path' => '/', 'httponly' => true]);
// 删除Cookie的方法是将其过期时间设置为过去的一个时间点,或者设置为空字符串并立即过期。
// setcookie("username", "", ['expires' => time() - 3600, 'path' => '/', 'httponly' => true]);
?>我个人觉得,setcookie()的参数真的挺多的,尤其是在PHP 7.3+之后,它开始支持数组形式的options参数,这让代码看起来更整洁,也更容易理解每个选项的含义。早期那种一长串参数的方式,说实话,记起来挺头疼的。但无论哪种方式,expires、path、domain、secure和httponly这几个参数,在实际项目中是必须要认真对待的。尤其是httponly,它能有效防止一些XSS攻击,让JavaScript无法访问到Cookie,这在我看来是安全防护的第一道屏障。
获取Cookie就直接多了,直接访问$_COOKIE这个超全局数组就行。但这里有个小“坑”需要注意:setcookie()函数只是向浏览器发送了一个HTTP响应头,指示浏览器设置Cookie。这意味着,在你调用setcookie()的当前脚本执行周期内,$_COOKIE数组并不会立即包含你刚刚设置的这个Cookie。你必须等到下一个HTTP请求,浏览器把Cookie带回来,PHP才能通过$_COOKIE访问到它。这有时候会让人有点迷惑,尤其是刚接触PHP的开发者。所以,如果你需要在设置Cookie后立即使用它,你可能需要自己把值也存到一个局部变量里。
PHP Cookie的过期策略与作用域精解
Cookie的生命周期和作用范围,是我们在使用它时最需要精细控制的两个方面。一个设置不当的Cookie,轻则无法达到预期效果,重则可能带来安全隐患。
过期时间,也就是expires参数,它决定了Cookie能在用户浏览器中“活”多久。如果这个参数不设置,或者设置为0,那么这个Cookie就变成了“会话Cookie”(Session Cookie),它会在浏览器关闭时自动销毁。这对于那些只需要在用户当前访问期间保持状态的场景非常有用,比如一个临时的购物车ID。但如果你想让用户下次访问时依然保持登录状态,或者记住某个偏好设置,那就必须设置一个未来的过期时间。比如time() + 3600 * 24 * 30,就是让Cookie在一个月后过期。这里有个小细节,expires参数接受的是一个Unix时间戳,而不是一个相对时间。我曾经就犯过直接写3600这种错误,结果Cookie瞬间就过期了,因为3600在Unix时间戳里是很久很久以前的某个时间点。
至于作用域,这包括path和domain。path参数定义了Cookie对哪个路径下的页面可见。默认情况下,它会被设置为当前请求的路径。但通常,我们会将其设置为/,表示整个网站的所有页面都可以访问这个Cookie。这样可以避免同一个网站的不同路径下,需要重复设置或获取Cookie的麻烦。domain参数则控制Cookie对哪个域名可见。默认情况下,它会被设置为当前域名。如果你想让子域名(比如blog.example.com和shop.example.com)也能共享同一个Cookie,你可以将domain设置为父域名,前面加个点,例如.example.com。但要小心,你不能把Cookie设置到别人的域名下,这是浏览器安全策略不允许的。这些参数的灵活运用,能帮助我们构建更健壮、更符合业务逻辑的应用。有时候,我甚至会为了某个特定功能,故意把path设置得非常具体,以避免不同模块间的Cookie冲突,这虽然有点“偏执”,但在大型复杂应用中,这种精细化管理还是很有必要的。
PHP Cookie与Session:选择与权衡
谈到PHP中的状态管理,Cookie和Session总是绕不开的话题。它们都用于在无状态的HTTP协议上维持用户状态,但实现方式和适用场景却大相径庭。
Cookie,正如我们前面所讨论的,是将数据直接存储在用户浏览器端。它的优点是实现相对简单,服务器端压力小,因为数据不需要服务器额外存储。但缺点也很明显:数据量受限(通常4KB左右),安全性较低(因为数据在客户端,容易被篡改或查看),且用户可以禁用Cookie。这使得Cookie更适合存储一些非敏感、少量、或者可以公开的数据,比如用户偏好设置、购物车ID(非敏感部分)、或者用于跟踪用户行为的标识符。
Session则不同,它将用户数据存储在服务器端,通常是通过文件、数据库或缓存系统来保存。服务器会为每个会话生成一个唯一的会话ID(Session ID),并将这个ID通过Cookie(或URL重写)发送给浏览器。浏览器每次请求时带上这个Session ID,服务器就能根据ID找到对应的会话数据。Session的优点是数据量几乎不受限制,安全性更高(敏感数据不直接暴露在客户端),且用户禁用Cookie时,仍可通过URL重写等方式维持会话(虽然现在很少用)。缺点是会增加服务器的存储和处理负担,尤其是在高并发场景下,Session的管理和扩展会成为一个挑战。
那么,何时选择Cookie,何时选择Session呢?我的经验是,涉及到用户敏感信息(如登录状态、权限信息、用户ID等)或者数据量较大的情况,Session是首选。 它可以确保这些数据的安全性和完整性。而对于那些非敏感、小体积、或者需要长期保持(即使浏览器关闭)的数据,Cookie则是一个轻量级的选择。比如“记住我”功能,通常会用一个长期Cookie来存储一个不包含敏感信息的token,服务器再根据这个token去验证用户。Session和Cookie并非互斥,它们常常协同工作。Session ID通常就是通过一个会话Cookie来传递的。理解它们各自的特点和限制,是构建健壮Web应用的关键一步。我个人觉得,过度依赖Cookie来存储所有状态信息,在安全性上是有点冒险的。
应对PHP Cookie的安全挑战与维护策略
Cookie虽然方便,但其基于客户端存储的特性也带来了不少安全隐患。忽视这些风险,可能会导致数据泄露、用户身份被劫持等严重问题。
最常见的安全挑战是跨站脚本攻击 (XSS) 和跨站请求伪造 (CSRF)。XSS攻击者通过注入恶意脚本,可能获取到用户的Cookie信息。为了防范XSS,httponly参数是你的重要盟友。设置httponly为true后,JavaScript就无法通过document.cookie访问到这个Cookie,大大降低了XSS攻击的风险。虽然不能完全杜绝,但它确实是道有效的防线。另一个要点是,永远不要把敏感信息(比如密码)直接存储在Cookie里,即使是加密后的也最好避免。
CSRF攻击则利用用户已登录的身份,诱导用户在不知情的情况下执行恶意操作。samesite属性是PHP 7.3+引入的一个非常重要的安全特性,它能有效缓解CSRF攻击。samesite有三个值:Lax、Strict和None。Lax是默认值,它允许顶级导航和GET请求发送Cookie,但POST请求或其他跨站请求则不会发送。Strict则更为严格,几乎所有跨站请求都不会发送Cookie。None则允许所有跨站请求发送Cookie,但必须同时设置secure为true,并且只在HTTPS连接下有效。我通常建议在生产环境中至少使用Lax,对于特别敏感的操作,可以考虑Strict。
此外,HTTPS 的使用至关重要。设置secure为true的Cookie只会在HTTPS连接下发送。这意味着即使Cookie被劫持,其内容也难以被窃听。在当今互联网环境下,全站HTTPS已经是标配,如果你的网站还在跑HTTP,那么Cookie的安全几乎无从谈起。
维护Cookie时,除了安全,还有一些实际操作的考量。例如,当用户登出时,务必删除所有相关的会话Cookie,这通常通过将Cookie的过期时间设置为过去来完成。定期审查Cookie的使用情况,确保没有不必要的、过期的或者设置不当的Cookie存在。对于一些业务逻辑复杂的场景,可能需要统一的Cookie管理机制,避免不同模块之间对Cookie的随意操作,导致混乱或冲突。我个人觉得,任何与用户身份或权限相关的Cookie,都应该被视作高风险数据,并施加最严格的安全防护。
终于介绍完啦!小伙伴们,这篇关于《PHP设置与获取Cookie的完整教程》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!
Redis缓存穿透、击穿、雪崩解决方案
- 上一篇
- Redis缓存穿透、击穿、雪崩解决方案
- 下一篇
- 喜马拉雅已购内容怎么批量管理
-
- 文章 · php教程 | 2小时前 | php csv 大数据量 PhpSpreadsheet Excel导出
- PHP导出Excel教程:PHPExcel与CSV使用详解
- 175浏览 收藏
-
- 文章 · php教程 | 2小时前 |
- PHP数组键值自定义对比技巧
- 265浏览 收藏
-
- 文章 · php教程 | 2小时前 | HLS PHP直播源码 流媒体服务器 Nginx-RTMP 播放配置
- PHP直播源码怎么用\_直播源码配置教程
- 252浏览 收藏
-
- 文章 · php教程 | 2小时前 |
- PHP中define与const区别解析
- 414浏览 收藏
-
- 文章 · php教程 | 2小时前 |
- PHPwhile循环详解与使用技巧
- 339浏览 收藏
-
- 文章 · php教程 | 3小时前 |
- PHP路由参数传递与call_user_func_array用法详解
- 115浏览 收藏
-
- 文章 · php教程 | 3小时前 |
- PHP循环中数据库查询优化方法
- 374浏览 收藏
-
- 文章 · php教程 | 3小时前 | docker Nginx dockercompose php-fpm PHP多版本
- Docker部署PHP多版本共存教程详解
- 355浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3203次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3416次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3446次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4555次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3824次使用
-
- PHP技术的高薪回报与发展前景
- 2023-10-08 501浏览
-
- 基于 PHP 的商场优惠券系统开发中的常见问题解决方案
- 2023-10-05 501浏览
-
- 如何使用PHP开发简单的在线支付功能
- 2023-09-27 501浏览
-
- PHP消息队列开发指南:实现分布式缓存刷新器
- 2023-09-30 501浏览
-
- 如何在PHP微服务中实现分布式任务分配和调度
- 2023-10-04 501浏览

