2011-05-12 66 views
4

我在php手册中读到了关于会话漏洞的问题,并且遇到了这个问题:我需要我的服务器/代码在成功验证用户之后生成会话ID。是我登录前生成的会话ID吗?

现在,我不知道什么时候php设置会话Id。我的PHP应用程序是类似MVC的,一切都通过index.php,并在index.php的顶部我有session.start(),因为每一个页面(登录后)使用会话。

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

如果一个会话实际上是在session.start()上产生的,我想一个好主意是在认证后重新生成session-id,这样做是否能解决问题?

回答

1

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

是的,它的确如此。

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

你是对的。

是否session.start()设置用户ID,或者是不产生会话ID,直到我把我的第一个会话变量...

在任何情况下,再生用户登录会话ID本质上你什么都不花费,即使你没有为非登录用户设置$_SESSION变量,如果你出于某种原因决定在将来这样做,你将被覆盖。

4

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

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

4

当调用session_start并且没有通过有效的会话ID时,PHP会生成一个新的会话ID。所以在你的情况下,用户在访问登录表单页面时已经获得会话ID。

这不是一般性的安全漏洞,但可能是您的应用程序容易受到session fixation的影响。为了避免有some counter-measures。关于认证最重要的是生成一个新的会话ID并使旧的无效。在将用户信息存储在会话中之前,您可以通过调用session_regenerate_id来做到这一点:

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