substacks/zebra_session

一个PHP库,作为PHP默认会话处理函数的包装器,将数据存储在MySQL数据库中,提供更好的性能、更高的安全性和防止会话固定和会话劫持的保护。

v2.4.0 2017-05-14 05:50 UTC

This package is not auto-updated.

Last update: 2024-09-29 02:39:20 UTC


README

zebrajs

Zebra_Session

一个用于替换PHP默认会话处理器的即插即用库,它将会话数据存储在MySQL数据库中,提供更好的性能、更高的安全性以及防止会话固定和会话劫持的保护。

Latest Stable Version Total Downloads Monthly Downloads Daily Downloads License

PHP中的会话支持是一种在网站页面后续访问中保留信息(变量)的方式。与cookie不同,变量不会存储在用户的计算机上。相反,只在访问者的计算机上的cookie中存储一个会话标识符,它与服务器上实际存储的会话数据相匹配,并通过$_SESSION超全局变量提供给我们。一旦我们打开会话,就会检索会话数据,通常在每个页面的开始时。

默认情况下,会话数据存储在服务器上的平面文件中,每个会话一个。这种场景的问题在于,性能会随着会话目录中会话文件数量的增加而成比例下降(取决于服务器操作系统能够处理具有大量文件的目录的能力)。另一个问题是,会话文件通常存储在一个任何人都可以读取的位置,在共享托管上提出了安全问题。

这就是Zebra_Session发挥作用的地方——一个作为PHP默认会话处理器的即插即用库,但不是将会话数据存储在平面文件中,而是存储在MySQL数据库中,提供更好的安全性和更好的性能。

Zebra_Session也是针对跨多个Web服务器(使用负载均衡器或轮询DNS)扩展的应用程序的解决方案,其中用户的会话数据需要可用。将会话存储在数据库中使它们对所有服务器都可用!

支持"flashdata" - 只在下一个服务器请求中可用,之后会自动删除的会话变量。通常用于信息或状态消息(例如:“数据已成功更新”)。

这个类受到了John Herren在Trick out your session handler文章中代码的启发,以及Chris Shiflett在其书籍Essential PHP Security第8章,共享托管,第78-80页中的代码。

Zebra_Session的代码注释详细,并在PHP错误报告级别设置为E_ALL时不会生成警告/错误/通知。

从2.0版开始,Zebra_Session实现了行锁,确保在多个并发AJAX请求的场合正确处理数据。

引用自Race Conditions with Ajax and PHP Sessions,Andy Bakun的一篇优秀文章

当不使用锁定时,多个请求(在这些图中表示为进程P1、P2和P3)不考虑其他进程和会话数据的状态,访问会话数据。请求的运行时间由每个进程的彩色区域的长度表示(实际的运行时间并不重要,只有相对的启动时间和持续时间)。

Session access without locking

在上面的示例中,无论P2和P3如何更改会话数据,会话中反映的唯一更改是P1所做的更改,因为它们是最后写入的。当使用锁定时,进程可以启动,在读取会话数据之前请求对其的锁定,然后一旦获得对其的独占访问权,就可以获得会话的一致性读取。在下图中,所有读取都发生在写入之后。

Session access without locking

进程执行是交错的,但会话数据的访问是序列化的。在进程请求会话锁和读取会话之间的这段时间内,进程正在等待锁被释放。这意味着您的会话数据将保持一致,但也意味着当P2和P3等待他们的锁时,没有任何事情发生。如果所有的请求都更改或写入会话数据,这可能不是很重要,但如果P2只需要读取会话数据(可能是为了获取登录标识符),则没有任何理由被阻止。

因此,最终,这并不是最好的解决方案,但仍然比没有好。最好的解决方案可能是按变量锁定。您可以在Andy Bakun的文章中找到关于所有这些的非常详细的介绍Ajax和PHP会话中的竞争条件

感谢Michael Kliewe将此问题带到我的注意中!

支持这个库的开发

Donate

功能

  • 作为PHP默认会话处理函数的包装器,但它不是将会话数据存储在平面文件中,而是将其存储在MySQL数据库中,提供更好的安全性和更好的性能。

  • 它是PHP默认会话处理器的直接替代品:使用库之前的PHP会话将以相同的方式使用;您不需要更改任何现有代码!

  • 实现行锁定,确保在多个并发AJAX请求的场景中正确处理数据。

  • 由于会话数据存储在数据库中,该库为跨多个Web服务器(使用负载均衡器或轮询DNS)扩展的应用程序提供了一个解决方案。

  • 拥有出色的文档

  • 代码注释丰富,当PHP的错误报告级别设置为E_ALL时,不会产生警告/错误/通知。

要求

PHP 5.1.0+,已启用mysqli扩展,MySQL 4.1.22+。

安装

下载最新版本,解压,并将其加载到您的项目中。

require_once ('Zebra_Session.php');

使用Composer安装

您可以通过Composer安装Zebra_Session。

composer require stefangabos/zebra_session:dev-master

安装MySQL表

注意名为install的目录中包含一个名为session_data.sql的文件。此文件包含用于由类存储会话数据的表的创建的SQL代码。使用您首选的MySQL管理器(如phpMyAdmin或出色的Adminer)导入或执行SQL代码到您选择的数据库中。

如何使用

请注意,此类假定存在到MySQL数据库的活跃连接,并且它不会尝试创建一个!如果您确实需要类来创建数据库连接,请将代码放在类的“open”方法中。

// first, connect to a database containing the sessions table
// like $link = mysqli_connect(host, username, password, database);

// include the Zebra_Session class
include 'path/to/Zebra_Session.php';

// instantiate the class
// this also calls session_start()
$session = new Zebra_Session($link, 'sEcUr1tY_c0dE');

// from now on, use sessions as you would normally
// this is why it is called a "drop-in replacement" :)
$_SESSION['foo'] = 'bar';

// data is in the database!

📚查看出色的文档