2

所以这是我的代码,如果点击记住我,它会发送一年的过期时间。如果不是,那么它将 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');
}
4

2 回答 2

3

这很简单。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 来指示它是否应该使用可能对我有用。

于 2013-08-26T22:26:49.653 回答
2

在您的代码session_set_cookie_params()中,无论如何都不会调用。因此我建议这样做:

session_set_cookie_params(0);
session_start();

if (isset($_POST['username']) && isset($_POST['password'])) {
...

请注意,始终调用session_set_cookie_params()会话 cookie 实际上很有用。

在每个用户级别更改时生成一个新的会话 ID

为了保护您的应用程序免受攻击,每次更改用户角色后都必须更改 sessionID:

  • 匿名用户 -> 登录用户
  • 登录用户 -> 匿名用户
  • 登录用户 -> 管理登录用户
  • ...

因此,如果用户登录或注销,请重新生成会话 ID,如下所示:

session_regenerate_id( true );

查看OWASPPHP 安全备忘单

会话文件被定期删除

使用 PHP 的标准会话策略,会话被映射到常规文件,即所谓的会话文件。如果用户关闭他的浏览器,会话文件将继续存在于文件系统中。很可能,操作系统将每天(晚上)删除一次会话文件。

因此,如果用户一天后回来,则 sessionID cookie 指向一个会话文件,该文件可能不再可用

公共电脑的案例

另外想象一个在公共 PC 上运行的浏览器:如果用户关闭他的浏览器并且新用户登录,其他用户会自动登录

于 2013-08-26T22:17:08.980 回答