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 更适合存储会话相关的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试最重要的事:测试用例的编写

前言 软件测试用例得出软件测试用例的内容,其次,按照软件测试写作方法,落实到文档中,两者是形式和内容的关系,好的测试用例不仅方便自己和别人查看,而且能帮助设计的时候考虑的更周。 一个好的测试用例必…

企业app软件定制开发的重点是什么?|小程序网站搭建

企业app软件定制开发的重点是什么?|小程序网站搭建 在当今数字化时代,企业对于信息技术的依赖越来越大。为了适应市场需求并提高内部运营效率,许多企业开始寻求定制开发企业app软件。这种定制开发可以根据企业的具体需求和业务流程进行个性化…

DITTEL控制器维修SENSITRON6-2AE

DITTEL工控产品维修包括:德国DITTEL平衡测试仪维修,DITTEL模块,过程监控模块,DITTEL控制器,平衡头,机电平衡头,显示器,平衡系统等产品。 DITTEL过程控制模块维修 DM6000是一个过程控制模块&…

5分钟带你了解什么是原型图!

原型图,亦称原型设计稿,在软件研发流程中是非常基础和重要的一类设计项目。而对于产品经理、交互设计师以及产品运营等职业群体来说,原型设计则是一门不可或缺的技能。并且,原型设计也是一门有门槛、有规范的工作。 什么是原型图…

【通俗易懂】git原理、安装及连接gitlab,github

目录 一、GIT原理【这部分也挺简单,可以看看,如果没时间可以直接跳到第二部分】 SVN与Git的的区别 二、安装Git 2.1 获取Git安装程序 2.2 Git安装过程 三、Git连接Gitlab 3.1 gitlab准备工作 3.2 本地计算机准备工作及配置git 四、Git连接Github…

【EI会议征稿】第七届电子器件与机械工程国际学术会议(ICEDME 2024)

第七届电子器件与机械工程国际学术会议(ICEDME 2024) 2024 7th International Conference on Electron Device and Mechanical Engineering 第七届电子器件与机械工程国际学术会议(ICEDME 2024)将于2024年3月15-17日在山西太原召…

Sui生态多家协议上线流动质押,兼顾收益与灵活性

在Sui上,流动质押协议允许DeFi用户质押SUI,并获得可交易或用于其他DeFi活动的流动质押标记token。这一过程绕过了传统质押中验证节点锁定token的问题。用户可以通过Sui的权益证明机制(PoS)确保网络的安全,同时参与生态…

微波功率计/频率计-87234系列USB峰值/平均功率计

仪器仪表 苏州新利通 87234系列 USB峰值/平均功率计 频率范围覆盖:50MHz~67GHz 一款基于USB 2.0接口的二极管检波式宽带功率测量仪器 国产思仪功率计 01 产品综述 87234D/E/F/L USB峰值/平均功率计是一款基于USB 2.0接口的二极管检波式宽带功率测…

GNSS技术在交通运输领域的创新应用

全球导航卫星系统(GNSS)技术在交通运输领域发挥着越来越重要的作用,为汽车导航、航空、海运等交通模式提供了精准的定位和导航服务。本文将深入探讨GNSS技术在交通运输领域的应用,以及它对交通管理、安全性和效率的积极影响。 一、…

嵌入式开发、C++后台开发、C++音视频开发怎么选择?

嵌入式开发、C后台开发、C音视频开发怎么选择? 在日常生活中,视频类应用占据了我们越来越多的时间,各大公司也纷纷杀入这个战场,不管是抖音、快手等短视频类型,虎牙、斗鱼等直播类型,腾讯视频、爱奇艺、优酷…

vue中使用echarts渐变柱状图 Cannot read properties of undefined (reading ‘graphic‘)解决方法

在使用渐变颜色时报错,Cannot read properties of undefined (reading ‘graphic’) echarts也下载了,引入了,就是报错,用不了new charts, 结果换了一个版本号就可以了,本来用的"echarts": "…

机器学习介绍与分类

随着科学技术的不断发展,机器学习作为人工智能领域的重要分支,正逐渐引起广泛的关注和应用。本文将介绍机器学习的基本概念、原理和分类方法,帮助读者更好地理解和应用机器学习技术。 一、机器学习的基本概念 机器学习是一种通过从数据中学…

leetcode——设计循环队列

设计循环队列 这个题目在这里小编只分享一个解题思路,因为还有一个思路小编还在尝试,一直过不了,还在这里不断尝试,等我试出来的时候我在分享给大家,首先我们在这里给出的是数组的形式,后面在分享单链表的思…

PHP手动为第三方类添加composer自动加载

有时候我们要使用的第三方的类库(SDK)没用用composer封装好,无法用composer进行安装,怎么办呢??? 步骤如下: 第一步、下载你需要的SDK文件包,把它放在vendor目录下 第二…

mricorn 手动勾画ROI并保存为模版的方法步骤

mricorn软件手动勾画ROI: 这里拿一个做了切除手术的癫痫病人举例子,我们需要把切除区域勾画出来并保存成切除的模版。 1、将图像导入到mricorn中 2、逐层勾画ROI并填充 比较方便的是从切除区域的起始层进行勾画,这里为了方便展示只勾画中间…

重装系统后如何恢复以前的文件?详细教程大揭秘!

在日常生活中,我们可能会遇到各种计算机问题,其中最严重的问题之一就是需要重装系统。在重装系统之前,我们通常需要考虑一个问题:重装系统后还能恢复以前的文件吗? 首先,我们需要明确一点,重装…

家政保洁预约小程序app开发特点有哪些?

家政预约服务小程序APP开发的特点介绍; 1. 低成本:用户通过手机APP下单,省去了中介费用,降低了雇主的雇佣成本。 2. 高收入:家政服务人员通过手机APP接单,省去了中介费用,从而提高了服务人员的…

AI越来越强,法律人是“躺”还是“卷”?

要点: 一、AI:到底是风口还是泡沫? 二、法律人为什么要学会用AI? 三、法律人为何用不好AI? 四、法律人的明天会怎样? 五、人类的明天会怎么样? 六、不确定的未来:“躺”还是“…

转行数据分析,一定要学会做BI报表

不开玩笑,现在的大趋势是做BI数据分析,所以如果是想要入行数据分析的,那么就需要学会做BI报表。现在很多的企业都在上BI,数据分析老人们也都在积极地学习使用BI,很大程度上是因为BI报表具备了无可替代的三大优势。 BI…

Ubuntu18.04安装LeGO-LOAM保姆级教程

系统环境:Ubuntu18.04.6 LTS 1.LeGO-LOAM的安装前要求: 1.1 ROS安装:参考我的另一篇博客Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客文章浏览阅读168次。Ubuntu18.04安装ROS-melodic保姆级教程https://blog.csdn.net/…