是登录前生成的会话ID?

时间:2011-05-12 09:39:03

标签: php security session sessionid

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

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

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

如果会话实际上已在session.start()上生成,我想一个好主意是在验证后重新生成session-id,在这种情况下会解决问题吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

这通常不是安全漏洞,但如果您的应用程序容易受到session fixation的攻击,则可能存在漏洞。为了避免some counter-measures。关于身份验证最重要的是生成新的会话ID并使旧的会话ID无效。您可以在将用户信息存储在会话中之前调用session_regenerate_id来执行此操作:

if ($userIsAuthentic) {
    session_regenerate_id(true);
    $_SESSION['user-id'] = 12345;
    /* … */
}

答案 2 :(得分:1)

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

是的,确实如此。

我想一个好主意是在验证后重新生成session-id,在这种情况下会解决问题吗?

你是对的。

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

在任何情况下,在用户登录时重新生成会话ID都会使您基本上没有任何成本,即使您没有为未登录的用户设置$_SESSION变量,如果由于某种原因您决定了这样做是为了将来。