繁体   English   中英

如何在客户端计算机上删除PHPSESSID

[英]How do I delete PHPSESSID on client computers

更新问题:

  • 在某些浏览器上,我们有两个PHPSESSID。
  • 我脚本中的任何地方都没有设置一个PHPSESSID
  • 它有HOST(而不是我设置的PHPSESSID的DOMAIN),如www.mywebsite.com
  • 我尝试使用setcookie删除它: setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/', 'www.mywebsite.com'); 但这失败了。
  • 尝试使用以下命令删除cookie: setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/'); 导致我设置的PHPSESSID被删除。
  • 我尝试使用session_name重命名我设置的SESSION。 这可以工作,但几分钟后几次崩溃了我的服务器。
  • 我没有选择。

我正在我的网站上使用PHP会话。

会话路径是/文件夹,稍后我改为/以适应新目的。

现在,老用户无法登录。

看起来他们现在有两个PHPSESSID存储在他们的浏览器上 - 一个带有路径/文件夹,另一个带有/。

我该怎么做才能确保旧用户可以登录,同时确保会话在整个网站范围内使用“/”。

更多信息

当我说两个phpsessionid时,请参考图像

两个PHPSESSID

  1. 如果我使用,登录工作

A. session_set_cookie_params(864000, '/cv', '.website.com', 0, 1);

但如果我使用,则无法工作:

B. session_set_cookie_params(864000, '/', '.website.com', 0, 1);

  • 如果我使用上面的版本2A,会话将仅在/ cv中可用,而在其他网站文件夹中不可用,例如。 /夹。

使用JAVASCRIPT删除PHPSESSID的更新

  • 当我运行alert(document.cookie)时,它会显示除PHPSESSID之外的所有cookie
  • 因此,删除PHPSESSID cookie的所有尝试都会失败,而其他cookie可能会被删除。

使用PHP删除PHPSESSID的更新

  • 当我var_dump($_COOKIE['PHPSESSID']); 返回的是具有path / cv的PHPSESSID的值
  • 尝试使用setcookie ("PHPSESSID", "", time() - 3600);删除setcookie ("PHPSESSID", "", time() - 3600); 失败。

我认为你正在混淆事情,或者你应该详细了解你的设置/问题。

PHP的会话路径是会话数据存储在服务器上的位置,而不是客户端。 请参阅文档: https//secure.php.net/manual/en/session.configuration.php#ini.session.save-path

您可以移动这些文件并在发生碰撞时替换/保留您认为合适的方式。 这几乎只受访问/移动内容时的读/写权限以及您的web服务器用户(例如apache或nginx)或php-user用于从/向新位置读取/写入它们所限制。

如果通过“浏览器中的PHPSESSID”表示会话ID是您的网址的一部分,这是一个不同的PHP设置,无论如何应该禁用,请参阅文档中的注意事项: https//secure.php.net/manual /en/session.configuration.php#ini.session.use-trans-sid

根据您更新的问题进行修改:

已经有一个很好的基于JS的解决方案,用于使旧cookie过期。 我会那样做的。 如果你不能这样做,你可以重定向到/cv有一个php脚本在那里读取cookie并将数据存储在某个地方(例如基于user_id的数据库)并使cookie过期。 然后,您可以重定向到旧页面,查找“/” - cookie并恢复数据。 这是一个非常丑陋的黑客,但我不认为你可以在PHP中获取每个路径的cookie,因为它是服务器端并且基于客户端提供的会话ID(但我可能是错的)。

我只是从/folder过期cookie。 这应该只留下一个会话cookie /

setcookie('PHPSESSID', '', time() - 86400, '/folder/');

您可以在session_start()之前使用session_name()更改新会话的cookie名称,并让问题在几天后自行解决。

session_name("SESSION_ID");
session_start();

您必须在客户端删除cookie。 使用javascript可以实现这一点。

在您的网站上试试这个javascript:

<script type="text/javascript">
     document.cookie = "PHPSESSID=;Path=/cv;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
</script>

一个例子:

对于此示例,请使用站点https://developer.mozilla.org/en-US/
如果我在cookie上加载此站点,则有以下条目 在此输入图像描述 现在我想删除名为dwf_section_edit的cookie。 要删除此cookie,我将过期日期设置为过去。 我执行后

document.cookie = "dwf_section_edit=;Path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;";

在控制台上,cookie就像你在下面的图像上看到的那样(我使用了表左下方的小刷新按钮,因为它只是在这个例子中是临时的)

在此输入图像描述

在下一次重新加载时,我在这个例子中再次获取cookie,因为Mozilla会将它还给我。 在您的网站上,您不必再次创建旧cookie,一切都很好。

我想你的脚本不知道,在session_start()时应该访问哪个会话;

尝试为会话指定正确的路径

ini_set('session.cookie_path', '/');

要么

session_start(['cookie_path' => '/']);

取决于您的设置

如果这没有帮助,我建议使用session_regenerate_id() ,它将用新的会话ID替换当前的会话ID,并保留当前的会话信息。

解决方案是让用户在会话到期时间内转到/文件夹路径。 在这条路径上创建php脚本,使用setcookie函数将所有COOKIES从/文件夹复制/ path( http://php.net/manual/ro/function.setcookie.php

foreach ($_COOKIE as $key => $value) {
    setcookie($key, $value, $expire, "/")
}
// redirect to "/" now. User will be able to login.

补充说明:cookie与路径绑定,其重要性(默认为/ ,但似乎不适用于您的情况)。 所以来自子路径(如/ folder或/ me)的PHPSESSID无法从父级访问。 他们从父母传播到孩子。 所以来自/我的 cookie与没有明确分配的/相同。

如果手动发送包含所需路径的新过期日期的标题,则客户端应将其删除。

session_start();
header("Set-Cookie:PHPSESSID=".session_id()."; expires=Sat, 07-Nov-1999 14:58:07 GMT; path=/cv/");

第一次,你有旧的cookie路径,但从第二页调用只有路径/的cookie将被存储和传输。

当您知道客户端是否受此问题影响或者持续一个月时,您可以发送此标头。

是的,你需要将cookie时间设置为负值,以便浏览器可以删除它,在adition中我们将存储的值设置为空字符串,这也有助于删除相同的cookie ...

这个(页面的顶部)可以做,只需确保session_start()首先:

setcookie('PHPSESSID', '', -3600, '/cv');

这在我的所有域名上完美运行,我曾经遇到过这个问题。

您可以通过将其设置为之前的过期来将其删除:

setcookie('phpsessid','value',time()-1);

调用setcookie函数时只需提供第4个参数:

setcookie ("PHPSESSID", "", time() - 3600, '/');

说明

setcookie()函数的第四个参数是要设置的会话的$path 为此,“默认值是设置cookie的当前目录。”。 (参见: http//php.net/manual/en/function.setcookie.php 。)因此,如果您从位于文件夹“/ folder”的文件中调用此函数,它将尝试从该文件夹中删除cookie只要。 通过将$path设置为“/”,我们告诉函数从根目录中删除session_id。

我测试了它,它成功地从cookie中删除了PHPSESSID

这里提到 ,虽然不推荐使用session_register()并且首选使用$ _SESSION: -

如果在调用此函数之前未调用session_start(),则将对没有参数的session_start()进行隐式调用。 $ _SESSION不会模仿此行为,并且在使用前需要session_start()。

然后,使用$ _SESSION,使用Auth = True附加一个JSON文件,TimeOut = 20分钟。
每当用户注销或超时后,设置Auth = False。 然后,使用PHP和。读取该JSON文件

然后,如果Auth = False,则使用PHP创建JS,即OnLoad事件, document.cookie = 'PHPSESSID' + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';

让我们回到基础 - 这是我认为你应该尝试的东西:运行你的网站。 记下PHPSESSID。 然后完全关闭浏览器,再次打开浏览器,然后运行您的站点。 检查PHPSESSID并查看它是否相同。

如果它不相同则不是cookie而是特定于浏览器会话的会话ID。 其次,如果PHPSESSID与第一次设置相同,那么它就是一个cookie,您将能够删除任何设置为cookie资源的key => value对。 可能是你在JS或PHP代码中引用了一些错误的东西。

请尝试这个并恢复结果。 它将提供更多的清晰度。 Sessions,LocalStorage,IndexDB,Cookies都是不同的东西,并以不同的方式引用。

您无法删除Cleint Browser的Cookie

首先要了解的是,您无法以任何方式删除客户端系统上的COOKIES 当您无效时,浏览器不会删除它,但会使cookie无效。 cookie仍然存在于客户端系统上。 但浏览器只是忽略它。 为了删除它,客户端必须自己完成。

要使您可以使用的所有会话无效

session_start(); // initialize session
session_destroy(); // destroy session
setcookie("PHPSESSID","",time()-3600,"/"); // delete session cookie

或javascript代码:

document.cookie = "PHPSESSID=; expires=Thu, 01 Jan 1970 00:00:00
        UTC;path=/;host=localhost";

在每种情况下,您都无法删除浏览器设置的cookie。 因为PHP和javascript只能发出命令,只会使已经设置的cookie无效。

只有删除Cookie的方法

  • 由客户自己。

  • 刷新cookie和缓存的方向

  • 卸载浏览器,然后重新安装。

实现目标的建议

创建一个新的PHP脚本并将其插入login.php的顶部,并在此脚本中检查是否有两个PHPSessionId,如果有两个,则销毁所有这些并重新加载页面。 直到您重新加载在任何事件将在会话之前使用的最后一个cookie。 您必须重新加载页面或重定向使用:

删除两个PHPSESSID

 count=0;

 foreach($_COOKIE as $key => $value){
    if ( $key == "PHPSESSID" ){
       count++;
    }
 }
 if (count>1){
    //Destory all cookies here
    foreach($_COOKIE as $key => $value){
          setcookie($key,"",time()-3600,"/");
    }

    //Reload/redirect the current page to dispose of all things
    header("Locations:" . $your_url);
    exit(0);
 }

现在每种情况下只会有一次PHPSESSID会话

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM