MikeCbrant/php-ultimate-sessions

dev-master 2017-11-04 22:41 UTC

This package is not auto-updated.

Last update: 2024-09-23 08:00:47 UTC


README

Build Status Code Climate Test Coverage

php-ultimate-sessions

这个库提供了一个简单的替代品来替换 PHP 的内置会话功能,通过强制执行推荐的 php.ini 会话设置和提供可选的会话数据加密(客户端存储密钥cookie)来提供更强大和安全的会话处理。加密通过使用优秀的 defuse/php-encryption 库提供。

库的主要组件包括

UltimateSessionHandler

一个扩展了 PHP 的 SessionHandler 类并增加了加密功能的类。类实例化会自动将 php.ini 会话设置设置为首选值,并通过 set_session_save_handler() 将类设置为会话保存处理程序。

UltimateSessionManager

这个类是围绕常见的 PHP 会话管理函数的面向对象包装,并增加了旨在增强安全性和正确会话管理行为的特性,包括

  • 基于时间戳的会话数据过期管理;
  • 根据可配置的时间和计数间隔自动重新生成会话 ID;
  • 基于请求头属性进行客户端指纹识别;
  • 在会话访问过期数据或指纹不匹配的情况下记录数据(可能需要进一步调查)。仅记录会话元数据中的数据。一个可选的 PSR-3 兼容的记录器可以用来替代默认的通过 error_log() 进行记录。

这个类允许设置回调,用于会话 ID 变更事件(ID 重新生成或从过期会话中转发的 ID)。例如,在推荐的库配置中,这个回调用于触发使用 UltimateSessionHandler::changeKeyCookieSessionId() 的加密密钥cookie重新生成。

对于实现自定义会话垃圾回收的情况(对于生产级应用程序,应强烈考虑这一点),这个类提供设置一个可选的回调,该回调传递会话 ID 和数据过期时间戳,可以使用它来标记在给定时间戳后适合进行垃圾回收的会话 ID(通过触摸文件、更新数据库字段等)。

UltimateSessionLoader

提供了一个简单的静态接口,允许使用推荐设置以及一些最小配置选项来一行实例化 UltimateSession 库。

要求

  • PHP OpenSSL 扩展(如果使用加密)
  • defuse/php-encryption
  • PHPUnit 6.1+(仅用于单元测试)

这个库通过 Travis CI 对以下进行了测试

  • PHP 7.0.*
  • PHP 7.1.*
  • PHP 夜间构建

完整库文档

Travis CI 构建状态

Code Climate 代码覆盖率和健康信息

Packagist 页面

用法

用法非常简单。使用 UltimateSessionLoader::initialize(),您可以用几行代码来设置。此方法的参数包括

  • $useEncryption(布尔值,默认 false)确定是否对会话数据应用加密。
  • $logger(Psr\Log\LoggerInterface,默认 null)一个 PSR-3 兼容的记录器可以附加到 UltimateSessionManager,以允许记录非标准会话访问事件。

示例代码用法

use \MikeBrant\UltimateSessions;

try {
    $sessionManager = UltimateSessionLoader::initialize(
        $useEncryption,
        $logger
    );
} catch (\Exception $e) {
    // handle as needed (or don't try-catch at all)
}
// replacement for session_start()
$result = $sessionManager->startSession();

// Make sure to investigate result of startSession()
// as false represents a case where an invalid session was attempted
// to be started
if($result === false) {
    // perhaps exit execution
    // at a minimum drop all user authentication/state
}

// set session data as normal
$_SESSION['data'] = 'value';

// manually regenerate session Id
// as typically done around authentication or privelege level change
$sessionManager->regenerateId();

// get session ID
$sessionId = $sessionManager->getSessionId();

// close session to write, replacement for session_write_commit()
$sessionManager->commitSession();

// destroy session. Not commonly used, by calling code, but can be
// used as necessary to unset $_SESSION and destroy session as done
// with session_destroy()
$sessionManager->destroySession();

还有更多配置选项。请参阅上述链接中的完整库文档。

请注意,虽然 UltimateSessionHandlerUltimateSessionManager 是设计在一起工作的,但每个类都可以独立使用。此外,UltimateSessionHandler 类还可以作为一个基类,以便在需要实现自定义会话存储(例如数据库、内存存储等)时扩展,而不仅仅是使用该类可以正常工作的内置PHP会话存储。

关于会话垃圾收集的说明

此库完全不执行会话垃圾收集或覆盖默认的 SassionHandler::gc() 行为。因此,此类将与PHP的内置会话存储一起工作,而不会对其基本行为进行任何修改。如果有人扩展 UltimateSessionHandler 以实现自定义数据存储,强烈建议不要依赖PHP的默认基于概率的垃圾收集方案(因此完全不要覆盖 gc() 方法)。最好使用基于计划的垃圾收集机制作为执行会话存储最终删除的手段。为此,UltimateSessionManager 类构造函数接受一个回调,该回调可以用作钩子,在您更新会话数据存储后使用时间戳,之后可以删除单个会话的数据。实际上,即使在您想覆盖基于概率删除方案的 gc() 的情况下,也可以使用此钩子(基于概率的方法触发 gc() 会话处理程序)。您只需确保您覆盖的 gc() 方法利用已设置在数据存储中的时间戳来确定会话数据删除的资格。

与PHP会话安全性相关的推荐阅读

PHP会话生命周期

PHP.net 会话管理基础

PHP.net 保护会话INI设置

PHP SessionHandler类