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

时间:2015-11-04 09:24:07

标签: php session

更新问题:

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

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

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

现在,老用户无法登录。

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

我可以做些什么来确保旧用户可以在确保会话在整个网站范围内登录时使用" /"。

更多信息

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

the two PHPSESSID

  1. 如果我使用
  2. ,则登录有效

    一个。 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']);返回的是具有路径/ cv的PHPSESSID的值
    • 尝试使用setcookie ("PHPSESSID", "", time() - 3600);删除失败。

13 个答案:

答案 0 :(得分:16)

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

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并恢复数据。这是一个非常丑陋的黑客,但我不认为你可以获得PHP中每条路径的cookie,因为它是服务器端并且基于客户端提供的会话ID(但我可能会是错的。)

答案 1 :(得分:5)

我只是将来自/folder的Cookie过期。这应该只为您提供/

的一个会话cookie
setcookie('PHPSESSID', '', time() - 86400, '/folder/');

答案 2 :(得分:5)

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

session_name("SESSION_ID");
session_start();

答案 3 :(得分:3)

您必须在客户端删除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上加载此站点,则有以下条目 enter image description here 现在我想删除名为dwf_section_edit的cookie。要删除此cookie,我将过期日期设置为过去。执行后

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

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

enter image description here

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

答案 4 :(得分:2)

我想你的脚本不知道,应该在session_start();

上访问哪个会话

尝试使用

指定会话的正确路径
ini_set('session.cookie_path', '/');

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

取决于您的设置

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

答案 5 :(得分:0)

该解决方案将允许用户在会话到期时间内转到 / folder 路径。在此路径上创建php脚本,使用 setcookie 函数(http://php.net/manual/ro/function.setcookie.php)将所有COOKIES从 / folder 复制到 / 路径

@WebServlet(urlPatterns={"/asyncservlet"}, asyncSupported=true)
// Rather than @WebServlet, you can also specify these parameters in web.xml    
public class AsyncServlet extends HttpServlet {
   @Override
   public void doGet(HttpServletRequest request, HttpServletResponse response) {
      response.setContentType("text/html;charset=UTF-8");
      final AsyncContext acontext = request.startAsync();
      acontext.start(new Runnable() {
         public void run() {
            // perform time consuming steps here.
            acontext.complete();
   }
}

其他说明:Cookie与路径相关联,其重要性(默认情况下为 / ,但似乎不在您的案件)。所以来自子路径(如/ folder或/ me)的PHPSESSID无法从父级访问。他们从父母传播到孩子。因此 / me 中的Cookie与 / 中的Cookie相同,但没有明确指定。

答案 6 :(得分:0)

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

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

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

如果您知道客户端是否受此问题的影响,或者在一个月内有此问题,您可以发送此标头。

答案 7 :(得分:0)

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

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

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

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

答案 8 :(得分:0)

您可以通过前一次设置将其删除来删除它:

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

答案 9 :(得分:0)

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

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

<强>解释

  

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

我已对其进行了测试,并成功从Cookie中删除了PHPSESSID

答案 10 :(得分:0)

提到here,但不推荐使用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;';

答案 11 :(得分:-1)

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

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

请尝试此操作并恢复结果。它将提供更多的清晰度。 Sessions,LocalStorage,IndexDB,Cookies都是不同的东西,参考不同。

答案 12 :(得分:-3)

您无法删除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);
 }

现在每个案例中只有I会话PHPSESSID