• 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
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • $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, '/');
    
    • 1
    • 2

    image-20231121135047126

    删除 Cookie

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

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

    image-20231121135228207

    修改 Cookie

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

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

    image-20231121135533232

    获取 Cookie

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

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

    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';
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在客户端浏览器中,会得到一个名为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']);
    
    • 1
    • 2

    image-20231121153038820

    // 销毁整个 Session
    session_destroy();
    
    • 1
    • 2

    image-20231121153133296

    修改 Session

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

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

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

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

    0x03 Cookie与Session的对比

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

    Cookie与Session的对比

    • 存储位置: Cookie 存储在客户端,Session 存储在服务器端。
    • 安全性: 由于 Session 存储在服务器端,相对来说比 Cookie 更安全,特别是对于敏感信息。
    • 用途: Cookie 更适合用于客户端的持久化存储,Session 更适合存储会话相关的数据。
  • 相关阅读:
    TypeScript基础之泛型介绍
    网球场地预约
    Java代码读取properties配置文件
    Direct3D粒子系统
    Spring之BeanFactoryPostProcessor(bean工厂后置处理器)
    npx 初始化 React 项目 踩坑记录
    JDBC【DBUtils】
    机器学习——回归
    sql之每日五题day02--多表联查/聚合函数/多值判断/函数
    arcgis js api 4.x加载geoserver发布的地方坐标系(自定义坐标系)的wms服务
  • 原文地址:https://blog.csdn.net/weixin_44369049/article/details/134533677