簡體   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