我的会话 ID 是在登录前生成的吗?
Posted
技术标签:
【中文标题】我的会话 ID 是在登录前生成的吗?【英文标题】:is my session id generated before login? 【发布时间】:2011-08-23 23:32:40 【问题描述】:我在 php 手册中阅读了会话漏洞并遇到了这个问题:我需要我的服务器/代码在成功验证用户身份后生成会话 ID。
现在,我不确定 php 何时设置会话 ID。我的 php 应用程序类似于 MVC,一切都通过 index.php,在 index.php 的顶部我有 session.start(),因为每个页面(登录后)都使用会话。
这是一个漏洞风险吗?或者,我应该这样说:这是否意味着在第一次到达我的站点时,甚至在登录之前,服务器是否为该用户设置了会话 ID? session.start() 是否设置了用户 ID,或者在我设置我的第一个会话变量之前没有生成会话 ID,即。直到我做 $_SESSION['foo']='bar'?
如果实际上已经在 session.start() 上生成了一个会话,我想一个好主意是在身份验证后重新生成会话 ID,这样可以解决问题吗?
【问题讨论】:
【参考方案1】:运行session_start()
时会生成会话ID。
最佳做法是在登录时使用 session_regenerate_id()
刷新会话 ID。
【讨论】:
【参考方案2】:当调用session_start
并且没有传递有效的会话ID 时,PHP 会生成一个新的会话ID。因此,在您的情况下,用户在访问登录表单页面时已经获得了会话 ID。
这不是一般的安全漏洞,但如果您的应用程序容易受到session fixation 的攻击,则可能会出现这种情况。为避免出现some counter-measures。关于身份验证最重要的是生成一个新的会话 ID 并使旧的会话 ID 无效。您可以通过在会话中存储用户信息之前调用session_regenerate_id
来做到这一点:
if ($userIsAuthentic)
session_regenerate_id(true);
$_SESSION['user-id'] = 12345;
/* … */
【讨论】:
【参考方案3】:或者,我应该这样说:这是否意味着在第一次到达我的站点时,甚至在登录之前,服务器是否为该用户设置了会话 ID?
是的,确实如此。
我想一个好主意是在身份验证后重新生成 session-id,这样可以解决问题吗?
你是对的。
session.start() 是否设置了用户 ID,或者在我设置第一个会话变量之前不会生成会话 ID...
在任何情况下,在用户登录时重新生成会话 ID 基本上不会花费您任何费用,即使您没有为未登录用户设置 $_SESSION
变量,如果出于某种原因您决定这样做,您也会受到保障以后也是这样。
【讨论】:
以上是关于我的会话 ID 是在登录前生成的吗?的主要内容,如果未能解决你的问题,请参考以下文章