4

我在 php 手册中阅读了会话漏洞并遇到了这个问题:我需要我的服务器/代码在成功验证用户身份后生成会话 ID。

现在,我不确定 php 何时设置会话 ID。我的 php 应用程序类似于 MVC,一切都通过 index.php,在 index.php 的顶部我有 session.start(),因为每个页面(登录后)都使用会话。

这是漏洞风险吗?或者,我应该这样说:这是否意味着在第一次到达我的站点时,甚至在登录之前,服务器是否为该用户设置了会话 ID?session.start() 是否设置了用户 ID,或者在我设置我的第一个会话变量之前没有生成会话 ID,即。直到我做 $_SESSION['foo']='bar'?

如果实际上已经在 session.start() 上生成了会话,我想一个好主意是在身份验证后重新生成会话 ID,在这种情况下是否可以解决问题?

4

3 回答 3

5

运行时会生成会话 ID session_start()

最佳做法是在登录时使用 刷新会话 ID session_regenerate_id()

于 2011-05-12T09:50:57.067 回答
4

PHP 在session_start被调用并且没有传递有效的会话 ID 时会生成一个新的会话 ID。因此,在您的情况下,用户在访问登录表单页面时已经获得了会话 ID。

这不是一般的安全漏洞,但如果您的应用程序容易受到会话固定的影响,则可能会出现这种情况。为了避免这种情况,有一些应对措施。关于身份验证最重要的是生成一个新的会话 ID 并使旧的会话 ID 无效。您可以通过session_regenerate_id在会话中存储用户信息之前调用来做到这一点:

if ($userIsAuthentic) {
    session_regenerate_id(true);
    $_SESSION['user-id'] = 12345;
    /* … */
}
于 2011-05-12T10:58:52.723 回答
1

或者,我应该这样说:这是否意味着在第一次到达我的站点时,甚至在登录之前,服务器是否为该用户设置了会话 ID?

是的,它确实。

我想一个好主意是在身份验证后重新生成会话 ID,在这种情况下是否可以解决问题?

你是对的。

session.start() 是否设置了用户 ID,或者在我设置我的第一个会话变量之前没有生成会话 ID...

在任何情况下,在用户登录时重新生成会话 ID 基本上不会花费您任何费用,即使您不$_SESSION为未登录用户设置变量,如果您将来出于某种原因决定这样做,您也会受到保障。

于 2011-05-12T09:49:52.613 回答