因此,这是我的代码,如果单击"记住我",它将发送一年的过期时间。如果不是,则将session_set_cookie_params()设置为0。这意味着它应该在浏览器关闭时销毁会话。然而,由于某种原因,它并没有这样工作。
这是我的登录页面:
session_start();
if (isset($_POST['username']) && isset($_POST['password'])) {
if (($_POST['username'] == $user) && ($_POST['password'] == $pass)) {
if (isset($_POST['rememberme'])) {
$_SESSION['username'] = $user;
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (60*60*24*365);
}
else{
$_SESSION['username'] = $user;
session_set_cookie_params(0);
}
header('Location: index.php');
} else {
$p->addContent('<font color = red>Wrong</font>');
}
}
这是我的索引页:
session_start();
if (isset($_POST['rememberme'])){
$user = $_SESSION['username'];
}
else {
$user = $_SESSION['username'];
session_set_cookie_params(0);
}
if ($user == null) {
$user = 'Guest';
$logout = $p->header()->addButton('Login', 'login.php', 'a', 'home', false, false, true);
$logout->rel('external');
}
else{
$logout = $p->header()->addButton('Logout', 'logout.php', 'a', 'delete', false, false, true);
$logout->rel('external');
}
这很简单。session_set_cookie_params(0);
不会影响您的会话,因为您在调用session_start();
之后调用它。
只需重新排序您的代码如下:
if (isset($_POST['username']) && isset($_POST['password'])) {
if (($_POST['username'] == $user) && ($_POST['password'] == $pass)) {
if (isset($_POST['rememberme'])) {
session_start();
$_SESSION['username'] = $user;
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (60*60*24*365);
} else {
session_set_cookie_params(0);
session_start();
$_SESSION['username'] = $user;
}
header('Location: index.php');
} else {
session_start();
$p->addContent('<font color = red>Wrong</font>');
}
} else {
session_start();
}
编辑:
session_set_cookie_params
只在当前脚本上工作,并且每次使用session_start()
时都必须再次调用,这也没有什么价值。设置一个cookie来指示是否应该使用它,这可能对我很有用。
在您的代码中,session_set_cookie_params()
在任何情况下都不会被调用。因此,我建议这样做:
session_set_cookie_params(0);
session_start();
if (isset($_POST['username']) && isset($_POST['password'])) {
...
注意,对于会话cookie,始终调用session_set_cookie_params()
实际上非常有用。
在每次用户级别更改时生成一个新的会话ID
为了保护您的应用程序免受攻击者的攻击,在每次更改用户角色后都必须更改sessionID:
- 匿名用户->登录用户
- 登录用户->匿名用户
- 登录用户->管理登录用户
因此,如果用户登录或注销,请重新生成会话ID,如下所示:
session_regenerate_id( true );
看看OWASP的PHP安全备忘单。
定期删除会话文件
使用PHP的标准会话策略,会话被映射到常规文件,即所谓的会话文件。如果用户关闭浏览器,会话文件将继续存在于文件系统中。操作系统很可能会每天删除一次会话文件(晚上)。
因此,如果用户一天后回来,sessionID cookie会指向一个会话文件,该文件可能不再可用。
公共PC的情况
此外,想象一个在公共PC上运行的浏览器:如果用户关闭浏览器,一个新用户登录,另一个用户将自动登录。