PHP中cookie与session使用指南

PHP中cookie与session使用指南

Cookie和session的出现,是为了解决http协议无状态交互的窘境,它们都用于存储客户端的相关信息

0x01 Cookie使用

简介

Cookie 是一种在客户端存储数据的机制,通常用于记录用户的状态和偏好。下面将介绍如何在 PHP 中进行 Cookie 的增、删、改、查操作。

在php中设置cookie都是使用setcookie()函数,这个函数可以接收7个参数分别代表:

setcookie(string $name,?string $value = "",?int $expire = 0,?string $path = "",?string $domain = "",?bool $secure = false,?bool $httponly = false
)
  • $name:它定义了Cookie的名称,后续我们要使用cookie就可以使用$name来进行访问。

    例如:

    image-20231121130300352

  • $value:Cookie 的值,默认为空字符串。注意,如果设置为 null,在某些情况下可能会被解释为空字符串。

    • Cookie的值一般用来进行用户身份识别状态跟踪安全性控制,它是cookie机制的核心,这种能力使得网站可以在用户访问不同页面或关闭浏览器后保持特定数据的状态和持久性。
    • 例如:
      • 一个登录逻辑,当用户成功登录后,服务器可能会创建一个包含用户身份信息的 Cookie,并在用户的每次请求中使用该 Cookie 进行身份验证。
      • 在购物车中,Cookie 可以用于存储用户的购物车内容,方便用户在不同页面或会话中保留购物车状态。
      • 还有一种常见的安全机制是将 CSRF 令牌存储在 Cookie 中,以便进行跨站请求伪造的防护。
  • $expire:Cookie 的过期时间,Unix 时间戳格式,默认为 0,表示会话级的 Cookie。设置为未来的时间戳则表示 Cookie 的过期时间。通俗的来说,它就是定义了Cookie的过期时间,当 Cookie 过期时,它不会立即被浏览器删除,而是在浏览器下一次发送请求时,服务器检测到 Cookie 已过期,于是命令浏览器删除这个过期的 Cookie。可以使用time()当前时间戳函数来定义,

    • 例如:
      • cookie(‘user_id’,’admin’,time()+60),则表示 Cookie 将在当前时间的 60 秒后过期。
      • image-20231121131923309
  • $path:Cookie 有效的路径。默认为整个域名。如果设置为 /,则在整个域名下有效。也就是说这个参数可以用于控制cookie,在哪里才能生效。

    • 例如:
      • 我修改成只有根目录下的index文件夹才能使用该cookie
      • image-20231121133325556
      • 可以发现在我创建cookie的index.php,无法访问cookie,但是在index文件夹下的cookie.php 却能正常去访问cookie。
  • $domain:Cookie 有效的域名,默认为空字符串,表示当前域名。如果设置为 .example.com,则在所有子域名下有效。这个参数与path的原理基本一致,只不过这里是设置范围是域名,需要注意的是,如果需要设置多个子域名访问同一个cookie,那么就需要设置多个cookie来实现。

  • $secure:用于指定 Cookie 是否只在通过 HTTPS 安全协议传输时发送。设置为 true 或数字 1 表示仅在 HTTPS 下发送该 Cookie,而设置为 false 或数字 0 则表示在 HTTP 或 HTTPS 下都发送。

  • $httponly:如果设置为 true,Cookie 将被设置为 HTTP Only,JavaScript 无法访问。当然这里也可以使用数字 1 来表示 true,使用数字 0 来表示 false

    • 当HTTPonly设置为1时,
    • image-20231121134646908
    • 当HTTPonly设置为1时
    • image-20231121134809038
增加 Cookie

使用 setcookie() 函数来添加或设置 Cookie。

// 设置 Cookie,名为 "user_id",值为 "123",有效期为一小时,作用路径为根目录
setcookie('user_id', '123', time() + 3600, '/');

image-20231121135047126

删除 Cookie

通过设置 Cookie 的过期时间为过去的时间来删除 Cookie。

// 删除名为 "user_id" 的 Cookie
setcookie('user_id', '', time() - 3600, '/');

image-20231121135228207

修改 Cookie

修改 Cookie 实际上是通过设置新的 Cookie 来实现的。

//修改名为 "user_id" 的 Cookie 的值为 "456",有效期为一小时,作用路径为根目录
setcookie('user_id', '456', time() + 3600, '/');
//也可以通过超全局数组来修改Cookie
$_COOKIE['user_id'] = 789

image-20231121135533232

获取 Cookie

通过 $_COOKIE 超全局数组来获取已设置的 Cookie 值。

// 获取名为 "user_id" 的 Cookie 的值
$userID = $_COOKIE['user_id'];

image-20231121135633217


0x02 Session使用

简介

Session 是服务器端存储用户信息的机制,用于在用户访问不同页面时保持会话状态。以下是 PHP 中使用 Session 的基本操作。

与Cookie不同的是,Session会把用户数据全部保存在服务端,然后由服务端生成以个Session-id 发送给客户端作为Cookie使用,服务端根据Session-id来判断哪一个才是用户的信息

在session中也有类似setcookie() 的配置方式,不过它是在php.ini配置文件当中。

image-20231121140256071

  1. session.save_handler: 定义 Session 数据的存储方式,比如使用文件系统、数据库等,默认为文件系统方式(files)。
  2. session.save_path: 指定 Session 数据存储的路径或者连接字符串(如数据库连接字符串),对于文件系统方式存储的 Session 数据,默认是服务器临时目录。
  3. session.use_cookies: 控制是否使用 Cookie 在客户端传输 Session ID,默认为 1(开启)。
  4. session.name: 设置用于保存 Session ID 的 Cookie 名称,默认是 PHPSESSID。
  5. session.cookie_lifetime: 设置 Session ID Cookie 的生存时间,以秒为单位,默认为 0,表示会话结束后失效。
  6. session.cookie_secure: 设为 1 时表示只有在使用 HTTPS 连接时才发送 Session ID Cookie,默认为 0。
  7. session.cookie_httponly: 设为 1 时表示 Session ID Cookie 仅通过 HTTP 协议访问,JavaScript 无法访问,默认为 0。
  8. session.gc_probabilitysession.gc_divisor: 控制 Session 回收机制的触发概率,用于清除过期的 Session 数据。
  9. session.use_strict_mode: 设为 1 时表示强制使用严格模式,拒绝非安全的 Session ID。

这些选项可以在 php.ini 中配置,以控制 Session 的行为。请注意,修改 php.ini 后,可能需要重启 Web 服务器才能生效。

增加 Session

使用 session_start() 开启会话并设置 Session 数据。

image-20231121140530186

当使用完session_start()会在客户端生成一个Cookie,里面的名称就是PHPSESSID是可以在php.ini中配置session.name来修改,也可以通过代码来实现修改.

session_name('PHPSEID'); //修改session的名称
session_set_cookie_params(0,'/','',0.1);//类似setcookie,除了没有名称与值这两个参数,其他均与setcookie参数一致,它的作用也是修改了session的cookie参数。
session_start(); //启动session机制
$_SESSION['user1'] = 'admin'; //设置seesion中的用户信息数据
$_SESSION['user2'] = 'text';

在客户端浏览器中,会得到一个名为PHPSEID的cookie。这个 Cookie 的值就是当前会话(Session)的 ID,它是服务器端用来识别特定会话的唯一标识符。

image-20231121143802743

在服务端,我们可以设置session.save_path来配置 session服务端的保存位置。

image-20231121152536897

而在这里存储的内容就是以序列化的形成保存用户信息,在服务器端,这些序列化后的数据会以特定的文件或其他存储方式保存在对应的 Session 目录中,文件名通常以 Session ID 命名。

image-20231121152835423

删除 Session

使用 unset()session_destroy() 函数来删除 Session 变量或销毁整个 Session。

// 删除名为 "user_id" 的 Session 数据
unset($_SESSION['user_id']);

image-20231121153038820

// 销毁整个 Session
session_destroy();

image-20231121153133296

修改 Session

修改 Session 实际上是重新赋值给 Session 变量。

// 修改名为 "user_id" 的 Session 的值为 "456"
$_SESSION['user_id'] = '456';
获取 Session

通过 $_SESSION 超全局数组来获取已设置的 Session 值。

// 获取名为 "user_id" 的 Session 的值
$userID = $_SESSION['user_id'];

0x03 Cookie与Session的对比

Cookie 和 Session 都用于在 Web 开发中存储用户信息,但在存储位置、安全性和使用场景上有所不同。

Cookie与Session的对比

  • 存储位置: Cookie 存储在客户端,Session 存储在服务器端。
  • 安全性: 由于 Session 存储在服务器端,相对来说比 Cookie 更安全,特别是对于敏感信息。
  • 用途: Cookie 更适合用于客户端的持久化存储,Session 更适合存储会话相关的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/157316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【日常总结】Swagger-ui 导入 showdoc (优雅升级Swagger 2 升至 3.0)

一、场景 环境: 二、存在问题 三、解决方案 四、实战 - Swagger 2 升至 3.0 (Open API 3.0) Stage 1:引入Maven依赖 Stage 2:Swagger 配置类 Stage 3:访问 Swagger 3.0 Stage 4:获取 js…

【JUC】十、ForkJoin

文章目录 1、分支合并框架2、案例3、ForkJoinTask4、工作窃取算法5、ForkJoinPool 一个个任务执行在一个个线程上,倘若某一个任务耗时很久,期间其他线程都无事可做,显然没有利用好多核CPU这一计算机资源,因此,出现了&q…

13 redis中的复制的拓扑结构

1、一主一从 为了性能考虑,主节点可以不开启AOF,但是要避免重启。 2、一主多从 适用于读操作的场景。由于从节点多,所以主的复制压力大 3、树状主从 数据先同步到redisB,redisC从节点C,E来看,redisB相当于主机了,可以…

【JavaEE】Servlet实战案例:表白墙网页实现

一、功能展示 输入信息: 点击提交: 二、设计要点 2.1 明确前后端交互接口 🚓接口一:当用户打开页面的时候需要从服务器加载已经提交过的表白数据 🚓接口二:当用户新增一个表白的时候,…

玩转系统|长亭雷池WAF详细使用教程——深入了解

目录 配置防护站点 界面操作​ 如何配置域名、端口、上游服务器​ 工作原理​ 在单独设备上部署雷池(推荐)​ 直接在网站服务器上部署雷池​ 和其他反代设备一起部署的情况​ 配置后网站无法访问,如何排查​ 测试防护效果 确认网站…

ETL-使用kettle批量复制sqlserver数据到mysql数据库

文章标题 1、安装sqlserver数据库2、下载kettle3、业务分析4、详细流程(1)转换1:获取sqlserver所有表格名字,将记录复制到结果(2)转换2:从结果设置变量(3)转换3&#xff…

【广州华锐互动】VR溺水预防教育:在虚拟世界中学会自救!

在现代社会中,水上安全和救援行动的重要性不言而喻。尤其在自然灾害、游泳事故或航海事故中,有效的救援行动可以挽救许多生命。然而,传统的救援训练往往存在成本高、风险大、效率低等问题。在这样的背景下,虚拟现实(VR…

Oracle实时同步技术

Oracle数据库的价值 Oracle数据库是一种高度可靠、安全和强大的关系型数据库管理系统,它具有以下几个方面的价值: 可靠性和稳定性:Oracle数据库以其高度可靠性、稳定性和数据完整性而闻名于世。 安全性:Oracle数据库提供了一系列…

【linux】安装telnet

Telnet Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令&#xf…

子虔科技亮相2023工业软件生态大会 以先进理念赋能工业软件发展

作为云化工业软件领先企业,子虔科技携多项全新云原生产品亮相2023工业软件生态大会。 本届大会以“共建新一代工业软件体系,引领制造业高质量发展”为主题,集结行业领先企业、行业专家探究工业软件在核心技术、产业链创新和生态建设等方面创…

XmlElement注解在Java的数组属性上,以产生多个相同的XML元素

例如&#xff0c;下面这段XML数据&#xff0c;有多个data元素&#xff0c;并且它们级别相同: <?xml version"1.0" encoding"UTF-8"?><request><reqtype>05</reqtype><secret>test</secret><body><userid&…

51单片机的智能浇花系统【含proteus仿真+程序+报告+原理图】

1、主要功能 该系统由AT89C51单片机LCD1602显示模块DHT11温湿度模块DS1302时间模块继电器驱动水泵模块光敏传感器等模块构成。适用于智能浇花、自动浇花、智能盆栽等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间、土壤温湿度、光照强度等信息 2、DHT11采集温湿度信…

使用kafka_exporter监控Kafka

prometheus 监控 kafka 常见的有两种开源方案,一种是传统的部署 exporter 的方式,一种是通过 jmx 配置监控, 项目地址: kafka_exporter:https://github.com/danielqsj/kafka_exporterjmx_exporter:https://github.com/prometheus/jmx_exporter本文将采用kafka_exporter方…

数据库基础入门 — SQL

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

原来 TinyVue 组件库跨框架(Vue2、Vue3、React、Solid)是这样实现的?

本文由 TinyVue 组件库核心成员郑志超分享&#xff0c;首先分享了实现跨框架组件库的必要性&#xff0c;同时通过演示Demo和实际操作向我们介绍了如何实现一个跨框架的组件库。 前言 前端组件库跨框架是什么&#xff1f; 前端组件库跨框架是指在不同的前端框架&#xff08;如…

Go——二、变量和数据类型

Go 一、Go语言中的变量和常量1、Go语言中变量的声明2、如何定义变量方式1&#xff1a;方式2&#xff1a;带类型方式3&#xff1a;类型推导方式定义变量方式4&#xff1a;声明多个变量总结 3、如何定义常量4、Const常量结合iota的使用 二、Golang的数据类型1、概述2、整型2.1 类…

go语言学习之旅之Go 语言指针

学无止境&#xff0c;今天继续学习go语言的基础内容 Go语言支持指针&#xff0c;允许你在程序中直接操作变量的内存地址。指针存储了变量的内存地址&#xff0c;通过指针&#xff0c;你可以直接访问或修改该地址上的值。 学习过c语言的一定知道指针 定义指针 在Go语言中&…

关于标准库中的string类 - c++

目录 关于string类 string类的常用接口 string类常用接口的简单模拟实现 关于string类 string类在cplusplus.com的文档介绍 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操作。 3. string在…

shell条件语句

一.条件测试 1.三种测试方法 ①test命令测试 ②[ ]测试&#xff08;注意前后需要有空格&#xff09; ③[[ ]]&#xff1a;加强版[ ]&#xff0c;测试支持通配符&#xff08;匹配字符串&#xff09;和正则表达式 二.条件语句 2.1 test命令 测试特定的表达式是否成立…

谷歌浏览器任意文件访问漏洞(CVE-2023-4357)复现

1.漏洞级别 高危 2.漏洞描述 该漏洞的存在是由于 Google Chrome中未充分验证 XML 中不受信任的输入。远程攻击者可利用该漏洞通过构建的 HTML 页面绕过文件访问限制&#xff0c;导致chrome任意文件读取。 总结&#xff1a;一个XXE漏洞 3.利用范围 Google Chrome < 116.…