0

0

php如何操作cookie_php设置和获取cookie的方法

冰火之心

冰火之心

发布时间:2025-08-29 09:40:01

|

655人浏览过

|

来源于php中文网

原创

PHP通过setcookie()设置Cookie,$_COOKIE获取,需关注有效期、路径、域及安全属性;httponly防XSS,samesite防CSRF,secure确保HTTPS传输,Session存敏感数据更安全,二者常结合使用。

php如何操作cookie_php设置和获取cookie的方法

PHP操作Cookie主要通过

setcookie()
函数来设置,并通过全局变量
$_COOKIE
数组来获取。这是一种在用户浏览器端存储少量数据,实现状态保持的常见机制,它让服务器能够“记住”用户的某些信息,从而提供更个性化或连续的体验。

PHP中设置Cookie的核心是

setcookie()
函数。它的基本用法很简单,比如你要设置一个名为
user_id
,值为
123
的Cookie,你可以这么写:
setcookie("user_id", "123");
。但通常,我们还需要考虑它的生命周期、作用域和安全性。一个更完整的设置可能像这样:

 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免费学习笔记(深入)”;

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协议上维持用户状态,但实现方式和适用场景却大相径庭。

Powtoon
Powtoon

AI创建令人惊叹的动画短片及简报

下载

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文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2787

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1685

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1546

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

1016

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1464

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1255

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1569

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 9.8万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号