2014-02-16 106 views
1

我使用PHP核心设计一个登录系统,请参考下面的代码 -声明session_start()函数?

funciton login($username,$password) { 

// mysql query to check the username and password 

if($res == 1) { 

    session_start(); 
$_SESSION['username'] = $username; 
$_SESSION['loggedin'] = 1; 
return true; 

} 

} 

正如你可以看到,我已经开始登录功能内部的会议上,有人告诉我是正确的或做我在应用程序的每个页面上开始会话,即在公共头文件中?

+0

改为在代码的顶部添加'session_start()'。 –

+0

这不是真的关于会话,但在函数声明 –

+0

oko ...你的意思是我需要在整个应用程序中常见的头文件中启动会话......对吗? – user3316682

回答

0

您应该尝试看看session_start()启动的“会话”与登录或不登录无关。在你的应用程序的每个脚本中(如果你的应用程序需要任何会话管理,那么作为你做的第一件事就是开始会话)。

会话代表您的网站上唯一访客的“访问”。理论上来说,访问可以由连续的登录/注销对组成。它仍然是同一次访问,但只是一个不同的登录名。

例如,如果您的网站上有“选择语言”下拉菜单,则可能需要存储用户在会话中所做的选择。当用户注销时,您仍然可能需要保留所选语言。有关用户登录或不登录的信息只是会话可以执行的一部分,因此会话应独立于可能的登录名而存在。

然后,您可以在该会话中存储“已登录”标志和用户名,并且只需在访问者注销后取消设置这两个值。

+0

我同意“会话”不一定被视为“登录会话”的含义,但将其视为“访问”可能同样存在问题,注销时的清除状态通常是一个好主意。如果有些事情需要生存下来,如果它们不是安全敏感的(例如首选语言),它们可以被复制到新的会话中,或者存储在单独的Cookie中,并具有不同的生命周期。 – IMSoP

+0

你能详细说明为什么结算状态“通常是一个好主意”?我看不到任何理由你应该清除所有内容,只有在注销后将其复制到新的会话中。 – jelrikvh

+0

从一般原则来看,白名单比黑名单更安全:如果只清除那些您认为敏感的部分,您可能会错过某些东西;如果您只复制那些您认为*不敏感的部分,并清除其他部分,则风险大大降低。 – IMSoP

0

session_start()并不意味着“现在创建会话”,它表示“打开当前会话,如果它存在,或创建,如果它不。

您可能想要销毁旧会话并在登录/注销操作中创建一个新会话(有各种微妙的安全攻击,如“会话劫持”和“会话固定”,避免这种攻击可能非常棘手)。

但是您需要在每个页面上运行session_start(),以确定用户是否已经登录。如果没有,$_SESSION将为空/未定义。