paragonie / cookie
PHP 7的现代cookie管理
Requires
- php: ^7
- delight-im/http: ^2.0
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
目录的内容复制到你的项目子目录下 - 通过
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
类的实例。这个类使用了合理的默认值,可能与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处理带来的会话固定攻击。
此外,可以通过
\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 许可证 的条款。