注销后 php CodeIgniter 后重播 cookie


Cookie replay after logout php CodeIgniter

我有一个登录和注销工作正常的应用程序。用户注销并尝试访问需要身份验证的页面后,他将被重定向到登录屏幕。

我的问题出在哪里。如果在我登录时,如果我复制cookie值并将它们保存在文件中。注销后,我更改cookie并添加相同的值,我以同一用户的身份重新登录应用程序。

在注销时,我编写了一个函数,该函数循环遍历所有cookie并删除它们。

我的理解是,cookie 既在客户端,也在服务器端。因此,如果 cookie 被删除,它们会在两侧被删除,并且服务器在清除它们后不会识别它们,即使浏览器再次将它们发回(我认为显然情况并非如此)。

我这样做的原因是,这是我们的安全审计员提出的要点之一,我需要找到一种方法来修复这个漏洞。(此时做https是不可行的)

如果有人能给我一些关于如何清除服务器端 cookie 的指示,我会很高兴,所以,当下次有人用相同的 cookie 攻击服务器时,它不接受它作为有效的 cookie。

编辑:

我正在使用代码点火器会话和tank_auth作为身份验证库。注销时,库本身调用

$this->ci->session->sess_destroy();

为了特别确定,我在几次尝试后尝试了以下内容:

session_start();
session_unset();
session_destroy();
session_write_close();
setcookie(session_name(),'',0,'/');
session_regenerate_id(true);

我的常规注销有效,如果我尝试直接访问该页面,它将无法打开。

但是,如果我在登录时拿走了我的cookie,将其保存在某个地方 - 成功注销并用旧的cookie替换cookie,我就可以立即返回会话。

有没有办法阻止这种行为 - 服务器端在会话被销毁后不会娱乐会话。我还确保我的服务器和 php 位于同一时区(使用 date_default_timezone_set 进行设置)。

Cookie 根本不存储在服务器上。这些存储在浏览器中,然后在请求标头中发送到服务器。您可以轻松找到允许您创建/编辑/删除 Cookie 的浏览器软件和插件。因此,您永远不应将敏感信息存储在 Cookie 中。本质上,您要做的是将用户数据存储在会话中,然后将会话名称存储在 cookie 中。通常,当您使用函数 session_start() 时,这是在 php 中自动完成的。

如果您使用的是 Codeigniter,PHP 会话函数将包装在每次页面加载时自动加载的 CI 会话库中。因此,与其将数据存储在 $_COOKIE 中,不如通过会话库中的 userdata 方法获取/设置数据:

//in your controller
//save session data
$userdata = array(
    "isLoggedIn"=>true,
    "username"=>$_POST['username']
);
$this->session->set_userdata($userdata);
//get session data later
$isLoggedIn = $this->session->userdata("isLoggedIn");
if(!$isLoggedIn){
    //if the user is not logged in, destroy the session and send to the login screen
    $this->session->sess_destroy();
    redirect("/");
}

请注意,上面的代码未经测试,只是应该让您知道去哪里。如果会话方法不适合您,您可能需要手动加载库:

//in the __construct method of your controller:
$this->load->library("session");

您可以在此处找到更多信息:http://ellislab.com/codeigniter/user-guide/libraries/sessions.html在这里:http://www.php.net/manual/en/book.session.php

谢谢你们的回答。

这就是我后来想到的。我不确定是什么原因造成的,但在尝试了所有内容后,会话并没有失效。我将代码点火器上的会话移动到数据库中。然后注销开始正常工作,注销后,如果再次将"被盗"/"保存"cookie放入浏览器中,则不会重新登录用户。

所以,这就是解决它的原因。