我在php手册中读到了会话漏洞,并遇到了这个问题:我需要我的服务器/代码来成功验证用户后生成会话ID。
现在,我不确定php何时设置会话ID。我的php应用程序类似MVC,一切都通过index.php,在index.php的顶部我有session.start(),因为每个页面(登录后)都使用会话。
这是一个漏洞风险吗?或者,我应该这样说:这是否意味着在首次到达我的网站时,即使在登录之前,服务器是否为该用户设置了会话ID? session.start()是否设置了用户ID,或者是在我设置第一个会话变量之前未生成的会话ID,即。直到我做$ _SESSION ['foo'] ='bar'?
如果会话实际上已在session.start()上生成,我想一个好主意是在验证后重新生成session-id,在这种情况下会解决问题吗?
答案 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
变量,如果由于某种原因您决定了这样做是为了将来。