PHP中cookie与session使用指南

news2024/7/6 17:42:03

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.coloradmin.cn/o/1233777.html

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

相关文章

电视机顶盒哪个牌子好?2023年终盘点网络电视机顶盒排名

2023年很快就要过去了,小编今天要盘点的是年度网络电视机顶盒排名,通过对比品控、配置、系统、操作、广告等方面后,我们从十多款入围的产品中精选了五款整理成网络电视机顶盒排名,想知道电视机顶盒哪个牌子好看这篇就足够了。 1、…

基于SVM的车牌识别算法

基于SVM的车牌识别系统(Python代码实现) 车牌识别系统是智能交通系统的重要组成部分,有着广泛的应用。车牌识别系统主要有车牌定位、字符分割和字符识别三部分组成,本文的研究重点是车牌字符识别这部分,本文提出了一种…

每日一练 | 华为认证真题练习Day134

1、开启标准STP协议的交换机可能存在哪些端口状态?(多选) A. Discarding B. Listening C. Disabled D. Forwarding 2、下列路由协议中优先级最高的是? A. Direct B. RIP C. OSPF D. Static 3、参考如图所示的输出结果&…

Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

基于JAVA+SSM+VUE+微信小程序的前后端分离的生活日用品交易平台的设计与实现

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着互联网的快速发展…

Qt应用开发(进阶篇)——线程 QThread

一、前言 QThread类继承于QObject基类,是Qt经典基础工具类,QThread类提供了一种独立于平台的方式来管理线程,让开发者能够快速的完成多线程的创建和使用。 正常情况下,一个PC程序使用到多线程的概率是非常高的,在不同方…

C#使用MaxMind.GeoIP2数据库查询当前ip地址

GeoLite2-City.mmdb下载 因为比较简单,直接上代码,代码展示获取ip地址的国家和城市信息 using MaxMind.GeoIP2; using MaxMind.GeoIP2.Model; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Sy…

利用 Gem5 模拟器创建一个简单的配置脚本——翻译自官网

文章目录 创建简单的配置脚本gem5 配置脚本关于模拟对象的插话 创建配置文件全系统与系统调用模拟 运行Gem5 创建简单的配置脚本 本章教程将指导你如何为 gem5 设置一个简单的模拟脚本,并首次运行 gem5。我们假定你已完成本教程第一章的学习,并已成功创…

DITTEL控制器维修SENSITRON6-2AE

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

第1关:图的邻接表存储及求邻接点操作

任务要求参考答案评论2 任务描述相关知识编程要求测试说明 任务描述 本关任务:要求从文件输入顶点和边数据,包括顶点信息、边、权值等,编写程序实现以下功能。 1)构造图G的邻接表和顶点集,即图的存储结构为邻接表。 …

使用wxPython和PyMuPDF合并PDF文档并自动复制到剪贴板

导语:处理大量的PDF文档可能会变得复杂和耗时。但是,使用Python编程和一些强大的库,如wxPython和PyMuPDF,可以使这个任务变得简单而高效。本文将详细解释一个示例代码,展示如何使用这些库来创建一个可以选择文件夹中的…

STM32 -Bin/Hex文件格式解析

文章目录 1. 概述2. Hex文件2.1 格式解析2.2 数据类型2.3 举例解析2.4 合并两个Hex文件方法 3 总结(未完待续) 1. 概述 Hex文件:它是单片机和嵌入式工程编译输出的一种常见的目标文件格式(比如keil就能编译输出hex文件&#xff0…

Kubernetes容器状态探测的艺术

在Kubernetes集群中维护容器状态更像是一种艺术,而不是科学。原文: The Art and Science of Probing a Kubernetes Container[1] 在Kubernetes集群中维护容器状态更像是一种艺术,而不是科学。 本文将带你深入理解容器探测[2],并特别关注相对较…

SQL常见函数整理 —— LAG() 向上偏移

1. 用法 窗口函数,用于访问窗口中当前行之前的行的数据。该函数可以根据需要计算当前行之前的值,使我们能够轻松地比较不同行之间的差异和变化。 2. 基本语法 LAG(column, offset, default_value) OVER (ORDER BY column)column:代表在返回…

代码随想录刷题】Day15 二叉树02------延伸题目练习

文章目录 1.【100】相同的树1.1 题目描述1.2 java代码实现 2.【572】另一棵树的子树2.1 题目描述2.2 java代码实现 【100】相同的树 【572】另一棵树的子树 1.【100】相同的树 1.1 题目描述 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。…

“轻松管理你的文件库:按大小归类保存,高效整理!“

亲爱的朋友们,你是否曾经为了整理电脑中杂乱无章的文件而感到烦恼?文件大小不一,无法快速找到所需内容,实在让人感到心力交瘁。但现在,我们为你带来一种全新的解决方案,让你的文件管理更轻松,更…

算法设计与分析复习--回溯(一)

文章目录 上一篇回溯法性质子集和问题装载问题0-1背包问题下一篇 上一篇 算法设计与分析复习–贪心(二) 回溯法性质 类似穷举的搜索尝试过程,在搜索尝试过程中寻找问题的解,组织得井井有条(避免遗漏)&am…

工业领域的设备“监测”和“检测”有何区别?

在工业领域中,设备的监测和检测是关键的运维活动,它们在保障设备可靠性和生产效率方面发挥着重要作用。尽管这两个术语经常被人们混为一谈,但它们在含义和应用上存在一些关键区别。 "监测"与"检测"的概念 1. 监测&#…

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

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

【Python】学习Python面向对象编程的疑问

(Java菜鸟来学Python了) 🤔 1. 静态方法与类方法什么区别? 实例方法只能被实例对象调用(Python3 中,如果类调用实例方法,需要显示的传self, 也就是实例对象自己),静态方法(由staticmethod装饰…