muglug/cookie

PHP 7 的现代 Cookie 管理

v3.3.0 2020-03-30 18:33 UTC

This package is auto-updated.

Last update: 2024-08-29 05:01:00 UTC


README

这是一个仅适用于 PHP7 的 Delight IM Cookie 库的分支,默认使用最高安全级别。

这意味着

  • 除非您覆盖它,否则“Secure”设置为 TRUE
  • 除非您覆盖它,否则“HTTP-Only”设置为 TRUE
  • 除非您覆盖它,否则“Same-Site”设置为 Strict

PHP 的现代 Cookie 管理

要求

  • PHP 7+

安装

  • 通过 Composer 安装(推荐)

    $ composer require paragonie/cookie

    包含 Composer 自动加载器

    require __DIR__.'/vendor/autoload.php';

  • 或者

  • 手动安装

    • src 目录的内容复制到您的项目子目录中
    • 通过 requirerequire_once 在您的代码中包含这些文件

使用方法

静态方法

此库提供了一个与 PHP 内置的 setcookie(...) 函数兼容的静态方法,同时支持如 SameSite 属性等更多最新功能。

\ParagonIE\Cookie\Cookie::setcookie('SID', '31d4d96e407aad42');
// or
\ParagonIE\Cookie\Cookie::setcookie('SID', '31d4d96e407aad42', time() + 3600, '/~rasmus/', 'example.com', true, true, 'Lax');

构建者模式

Cookie 类的实例允许您通过设置单个属性方便地构建 Cookie。此类使用合理的默认值,可能与 setcookie 函数的默认值不同。

$cookie = new \ParagonIE\Cookie\Cookie('SID');
$cookie->setValue('31d4d96e407aad42');
$cookie->setMaxAge(60 * 60 * 24);
// $cookie->setExpiryTime(time() + 60 * 60 * 24);
$cookie->setPath('/~rasmus/');
$cookie->setDomain('example.com');
$cookie->setHttpOnly(true);
$cookie->setSecureOnly(true);
$cookie->setSameSiteRestriction('Strict');
// echo $cookie;
$cookie->save();

方法调用也可以进行链式调用

(new \ParagonIE\Cookie\Cookie('SID'))->setValue('31d4d96e407aad42')->setMaxAge(60 * 60 * 24)->setSameSiteRestriction('Strict')->save();

可以像这样简单地删除 Cookie

$cookie->delete();

注意:为了使删除生效,Cookie 必须与最初保存的 Cookie 具有相同的设置。因此,您应该记得再次传递适当的值给 setPath(...)setDomain(...)setHttpOnly(...)setSecureOnly(...)

管理会话

使用 Session 类,您可以以与 PHP 内置的 session_start() 函数兼容的方式启动和恢复会话,同时也能访问此库提供的改进的 Cookie 处理。

// start session and have session cookie with 'lax' same-site restriction
\ParagonIE\Cookie\Session::start();
// or
\ParagonIE\Cookie\Session::start('Lax');

// start session and have session cookie with 'strict' same-site restriction
\ParagonIE\Cookie\Session::start('Strict');

// start session and have session cookie without any same-site restriction
\ParagonIE\Cookie\Session::start(null);

所有三个调用都尊重 PHP 的 session_set_cookie_params(...) 函数的设置和配置选项 session.namesession.cookie_lifetimesession.cookie_pathsession.cookie_domainsession.cookie_securesession.cookie_httponlysession.use_cookies

同样,也通过以下方式提供替代品

session_regenerate_id();
// and
session_regenerate_id(true);

通过以下方式提供

\ParagonIE\Cookie\Session::regenerate();
// and
\ParagonIE\Cookie\Session::regenerate(true);

如果您想要通过改进的 Cookie 处理来防止会话固定攻击。

此外,通过以下方式提供对当前内部会话 ID 的访问

\ParagonIE\Cookie\Session::id();

作为以下内容的替代品

session_id();

读取和写入会话数据

  • 从会话中读取值(可选默认值)

    $value = \ParagonIE\Cookie\Session::get($key);
    // or
    $value = \ParagonIE\Cookie\Session::get($key, $defaultValue);
  • 向会话中写入值

    \ParagonIE\Cookie\Session::set($key, $value);
  • 检查会话中是否存在值

    if (\ParagonIE\Cookie\Session::has($key)) {
        // ...
    }
  • 从会话中删除值

    \ParagonIE\Cookie\Session::delete($key);
  • 读取 然后 立即从会话中删除值

    $value = \ParagonIE\Cookie\Session::take($key);
    $value = \ParagonIE\Cookie\Session::take($key, $defaultValue);

    这对于闪存消息很有用,例如与 has(...) 方法结合使用。

解析 Cookie

$cookieHeader = 'Set-Cookie: test=php.net; expires=Thu, 09-Jun-2016 16:30:32 GMT; Max-Age=3600; path=/~rasmus/; secure';
$cookieInstance = \ParagonIE\Cookie\Cookie::parse($cookieHeader);

规范

贡献

欢迎所有贡献!如果您想贡献,请首先创建一个问题,以便讨论您的功能、问题或疑问。

许可协议

本项目的许可条款遵循 MIT 许可协议