danack / asm
PHP会话管理的用户空间替代品。
Requires
- ircmaxell/random-lib: ^1.1.0
- predis/predis: ^1.0.1
Requires (Dev)
- mikey179/vfsstream: 1.5.0
- phpunit/phpunit: 4.6.6
- rdlowrey/auryn: ^1.0.2
- squizlabs/php_codesniffer: ^2.0.0
This package is auto-updated.
Last update: 2024-09-20 11:18:20 UTC
README
目前还没有正确工作...
高级会话管理
术语
用户配置文件
用户配置文件是一个字符串,包含有关访问会话的计算机的一些信息。例如,计算机的IP地址和用户代理。
当会话被访问时,当前请求的用户配置文件将与已经用于访问会话的用户配置文件进行比较。如果不相同,将调用profileChanged可调用函数。
这可以用来检测和防止攻击者能够访问会话,即使他们知道会话ID。必须由使用此库的程序员提供profileChanged可调用函数的实现。
对于只显示搞笑猫图片的网站,这种安全检查可能非常宽松,或者完全缺失。
对于银行或其他安全至关重要的网站
僵尸会话
会话固定是一种攻击,其中第三方设法弄清楚某人的会话ID,并可以欺骗。
可以使用Session::regenerateSessionID限制这些攻击,它为合法用户生成一个新的会话ID。然而,这会导致短时间内多个请求到达时出现问题。
例如,一个用户浏览到您的网站,打开3个标签指向不同的页面。
驱动程序
ASM可以使用多个后端存储系统,提供这些的代码称为“驱动程序”。目前,已实现了Redis和文件系统驱动程序。非常欢迎为其他存储系统提供驱动程序的pull请求。
锁定
-
打开时锁定-
-
写入时锁定-
回调
配置文件更改
function profileChanged(\Asm\Session $session, $newProfile, $previousProfiles) { if (isProfileChangeAllowed($newProfile, $previousProfiles) == false) { throw new UserDefinedException("配置文件差异太大。"); }}
$previousProfiles[] = $newProfile;
return $previousProfiles;
}
访问僵尸密钥
当用户尝试使用实际上现在是僵尸ID的会话ID时被调用。
function zombieKeyAccessed(\Asm\Session $session) {
}
访问无效会话
当用户尝试使用无效的会话ID时被调用。这可以用于防止洪泛攻击,其中有人尝试大量请求来猜测会话ID
function invalidSessionAccessed(\Asm\Session $session) {
}
会话丢失锁定
在某些情况下,会话数据的锁定可能会丢失。
function lostLockCallable(\Asm\Session $session) {
}
目标
显式锁定
明确并暴露锁定,类似于数据库暴露不同级别的锁定,并允许应用程序选择适当的级别。例如,以只读模式打开,在需要时获取写锁。 http://msdn.microsoft.com/en-us/magazine/cc163730.aspx
无锁更新
- 公开Redis无锁命令,例如 https://redis.ac.cn/commands/INCR, https://redis.ac.cn/commands/append, https://redis.ac.cn/commands/rpush 等 - 以允许显式无锁修改会话数据。
显式更新
允许用户取消更新?
安全
-
当检测到无效的会话ID尝试访问系统时,通知客户端。
-
允许实现重新生成会话ID的策略,例如基于用户IP变化的规则,将会话锁定到特定的用户代理。
-
默认强制cookie仅通过HTTP访问。
管理
-
用户应生成一个常规任务来清理旧会话,而不是让它们通过现有进程随机进行垃圾收集。
-
允许最近重新生成的会话ID在新会话ID中继续访问相同的数据一段时间,以便在同时进行Ajax请求的同时允许会话再生。例如,bcit-ci/CodeIgniter#1900
其他想法
在请求的生命周期中,您的会话被订阅到一个pub-sub馈送。如果任何其他并发请求修改了会话,您的会话副本将收到发布更新。
session_discard - 为什么需要它?
为什么?
//TODO - PHP通过这些函数抽象会话的方式真的很糟糕。您应该构建一个完整的响应,然后一次性发送所有内容,而不是在调用此函数时发送头信息。session_start();
// session_destroy 是邪恶的 - 通过 setSessionVariable 设置的会话变量仍然可以设置,并且对于同一页面的查看将工作。但是,在下一个页面查看时它们会消失。将 $_SESSION 变量设置为一个空数组可以正确删除所有以前的条目。
//PHP自动修改了GET会话行为 - /* 检查当前请求是否由外部网站引用,该引用使先前找到的id无效。 */
/* 最后检查会话ID是否包含危险字符 * 安全提示:会话ID可能嵌入在HTML页面中。*/
问题
是否应该支持会话重命名?
PHP当前'加密'会话数据?
测试
单元测试
php vendor/bin/phpunit -c test/phpunit.xml
代码风格
php vendor/bin/phpcs --standard=./test/codesniffer.xml --encoding=utf-8 --extensions=php -p -s lib