首页 > 解决方案 > PHP Session:ID 仅在服务器端生成?

问题描述

考虑以下 PHP 脚本:

<?php
session_start();
echo session_id();

当您通过浏览器打开此页面时,您应该会看到服务器生成的会话 ID。
对于标准的 php.ini 设置,此会话 ID 可能是 32 个字符,范围为​​ 0-9 av(每个字符 5 位)。例子:

va9o92iefqoe0ouiado99r9hr299oamc

现在,假设您在浏览器中手动将 cookie 的会话 ID 从va9o92iefqoe0ouiado99r9hr299oamc更改为z,然后再次访问上述脚本:

起初,我希望 PHP 应该足够聪明,能够识别出这样的会话 ID 不是由服务器生成的,因此应该忽略它,并且应该在服务器端生成一个新的。不幸的是,事实并非如此。z实际上,PHP 只是作为会话 ID前进。

我不确定恶意用户如何利用它,但我不喜欢在客户端生成会话 ID 的想法。

 

问题

我错过了什么吗?如果没有,如何加强 PHP 会话以缓解此类问题?

标签: phpsessioncookies

解决方案


根据php.ini:

; Whether to use strict session mode.  
; Strict session mode does not accept an uninitialized session ID, and  
; regenerates the session ID if the browser sends an uninitialized session ID.  
; Strict mode protects applications from session fixation via a session adoption  
; vulnerability. It is disabled by default for maximum compatibility, but  
; enabling it is encouraged.  
; https://wiki.php.net/rfc/strict_sessions  
session.use_strict_mode = 0  

 

此外,可在PHP 手册中找到:

何时启session.use_strict_mode用。您不必删除过时的会话 ID cookie,因为当没有与会话 ID 关联的数据并设置新的会话 ID cookie 时,会话模块将不接受会话 ID cookie。建议对所有站点启用。session.use_strict_mode

 

因此,只需更改为session.use_strict_mode = 1即可避免客户端生成会话 ID。


推荐阅读