paragonie/cookie

PHP 7的现代cookie管理

v3.2.0 2017-06-21 16:15 UTC

This package is auto-updated.

Last update: 2024-09-21 20:18:01 UTC


README

这是Delight IM的Cookie库(https://github.com/delight-im/PHP-Cookie)的PHP 7专用的分支,默认使用最高级别的安全性。

这意味着

  • 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类的实例。这个类使用了合理的默认值,可能与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处理带来的会话固定攻击。

此外,可以通过

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

来提供当前内部会话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 许可证 的条款。