substacks / zebra_session
一个PHP库,作为PHP默认会话处理函数的包装器,将数据存储在MySQL数据库中,提供更好的性能、更高的安全性和防止会话固定和会话劫持的保护。
Requires
- php: >=5.1.0
README
Zebra_Session
一个用于替换PHP默认会话处理器的即插即用库,它将会话数据存储在MySQL数据库中,提供更好的性能、更高的安全性以及防止会话固定和会话劫持的保护。
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)不考虑其他进程和会话数据的状态,访问会话数据。请求的运行时间由每个进程的彩色区域的长度表示(实际的运行时间并不重要,只有相对的启动时间和持续时间)。
在上面的示例中,无论P2和P3如何更改会话数据,会话中反映的唯一更改是P1所做的更改,因为它们是最后写入的。当使用锁定时,进程可以启动,在读取会话数据之前请求对其的锁定,然后一旦获得对其的独占访问权,就可以获得会话的一致性读取。在下图中,所有读取都发生在写入之后。
进程执行是交错的,但会话数据的访问是序列化的。在进程请求会话锁和读取会话之间的这段时间内,进程正在等待锁被释放。这意味着您的会话数据将保持一致,但也意味着当P2和P3等待他们的锁时,没有任何事情发生。如果所有的请求都更改或写入会话数据,这可能不是很重要,但如果P2只需要读取会话数据(可能是为了获取登录标识符),则没有任何理由被阻止。
因此,最终,这并不是最好的解决方案,但仍然比没有好。最好的解决方案可能是按变量锁定。您可以在Andy Bakun的文章中找到关于所有这些的非常详细的介绍Ajax和PHP会话中的竞争条件。
感谢Michael Kliewe将此问题带到我的注意中!
支持这个库的开发
功能
-
作为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!
📚查看出色的文档!