我的会话 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 是在登录前生成的吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Play 缓存 API 存储用户会话 ID?

如何通过邮递员中的cookie传递会话ID并登录?

Fastlane:如何自动获取 Apple ID 的登录会话?

登录后在会话中存储变量

ASP.NET 中的会话固定

带有来自 WebService 的会话 ID 的 IOS 登录 JSON 解析器