muglug / cookie
PHP 7 的现代 Cookie 管理
Requires
- php: ^7.1
- delight-im/http: ^2.0
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
目录的内容复制到您的项目子目录中 - 通过
require
或require_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.name
、session.cookie_lifetime
、session.cookie_path
、session.cookie_domain
、session.cookie_secure
、session.cookie_httponly
和 session.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 许可协议。