我最近需要验证PHP会话ID创建的值。经过一些研究,我意识到有两个与此值相关的有趣的php.ini配置设置:
session.sid_length是ID中的字符数 session.sid_bits_per_character控制使用的字符集。从手册上可以知道可能的值为 '4'(0-9,af),'5'(0-9,av)和'6'(0-9,az,AZ,“-”,“,”)
因此,要验证会话ID,我们需要创建一个正则表达式,以查找预期长度的正确字符集。
function isValidSessionId(string $sessionId): bool { $sidLength = ini_get('session.sid_length'); switch (ini_get('session.sid_bits_per_character')) { case 6: $characterClass = '0-9a-zA-z,-'; break; case 5: $characterClass = '0-9a-v'; break; case 4: $characterClass = '0-9a-f'; break; default: throw new \RuntimeException('Unknown value in session.sid_bits_per_character.'); } $pattern = '/^[' . $characterClass . ']{' . $sidLength . '}$/'; return preg_match($pattern, $sessionId) === 1; }
本篇文章学习自akrabat.com博客,不建议使用本方法验证,因为ini的配置会动态变更,另外定义的各种字母后期会发生变化,对应的场景基本不存在