我有一个登录和注销工作正常的应用程序。一旦用户注销并尝试访问他需要验证的页面,他就会被重定向到登录屏幕。
我的问题出在哪里。如果在我登录时,如果我复制 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
)。