1

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

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

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

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

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

如果有人能告诉我如何清除服务器端的 cookie,我会很高兴,所以,当下次有人用相同的 cookie 访问服务器时,它不会接受它作为有效的 cookie .

编辑:

我使用 codeigniter 会话和 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 替换,我会立即回到会话中。

有没有办法阻止这种行为——服务器端在会话被破坏后不会接受它。我还确保我的服务器和 php 位于同一时区(使用 设置date_default_timezone_set)。

4

2 回答 2

2

Cookies 根本不存储在服务器上。这些存储在浏览器中,然后在请求标头中发送到服务器。您可以轻松找到允许您创建/编辑/删除 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

于 2013-10-17T19:52:02.793 回答
0

谢谢你们的回答。

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

所以,这就是解决它的方法。

于 2013-10-20T14:40:27.507 回答