簡體   English   中英

PHP會話隨機過期

[英]PHP session randomly expires

開始我想解釋一下我想要完成的事情。 所以我有一個系統,如果用戶登錄,他們的用戶名將存儲在$_SESSION['username'] 在每個頁面上我都有session_start(); 然后我經常檢查if(isset($_SESSION['username']))來顯示不同的東西。

這一切都很有效,除了會話在超時之前到期,或者$_SESSION['username']變量在超時之前未設置,導致系統認為用戶需要注銷。 我真的想補充一點,這是隨機發生的!

我可以在網站上花10分鍾,互動間隔不同,沒有任何事情發生,接下來我知道,我在3分鍾內被踢了兩次。

我可以驗證session.cookie_lifetime = 0 (這意味着它將在瀏覽器關閉之前不會過期)和session.gc_maxlifetime = 1200 (這沒關系,因為我已將會話保存文件夾設置在不同於TMP)。

我可以想到的唯一問題可能是問題,一旦驗證密碼,登錄部分中的代碼就是:

$_SESSION['username'] = $usernameInput;
session_write_close();
header("Location: index.php");

我知道使用header意味着會話變量不會被保存,因為它會刪除文檔,但這就是我使用session_write_close(); 保存這些變量。 請記住:此后一切正常! 一旦到達index.php,我就可以看到我的用戶名。

有一些SO線程導致用戶將會話變量和內容保存在數據庫中,但我寧願修復它而不必這樣做。

編輯:所以我重新引入了一個函數來計算會話超時,這是有效的,但我已經發現了。 我查看了瀏覽器的network部分,在XHR我查找會話和cookie以及其他內容。 網站對我的logout.php文件發出GET請求時會發生奇怪的事情。

所以我看看可能導致這種情況的原因。 我有兩個注銷按鈕,由PHP回應,我給了他們每個不同的href鏈接。 我把它縮小到這個PHP和HTML。 上次我檢查時,HTML不會自動轉到它的代碼中的href。 而且我懷疑PHP會這樣做。

if(isset($_SESSION['username'])){
            echo "<div class='navProfile navButton'><img class='navProfileIcon' src='images/angerypigeon.jpg' alt=''><h3 class='navProfileUsername'>" . $_SESSION['username'] . "</h3><h3 class='navProfilePosts'>Posts: 102</h3><a class='navProfileLogout' href='php_tools/logoutbutton2.php'>Logout</a></div>";
            echo "<button class=\"modalButton upload navButton\" id=\"uploadButton2\" type=\"button\" name=\"button\" style=\"margin-left: auto\">Upload</button>";
        }
        else {
            echo "<button class='navButton' type=\"button\" name=\"button\" onclick=\"location.href = 'login.php'\">Login</button>";
        }

當我在瀏覽器中檢查我的XHR字段時,它會發送logoutbutton2的GET請求。 我怎樣才能防止這種情況發生? 我自己沒有點擊按鈕。 它隨機發送。

由於我無法查看我只能推測的所有代碼。 有什么可能在“隨機”中殺死會話。

也許你有:

  • 你的代碼中有$ _SESSION ['username'] =''或$ _SESSION =''之類的東西。 再次檢查。
  • 有些代碼在session_start前吐出一些字符?
  • 一個奇怪的啟發式adblock-privacy-whatnot-browser插件會阻止你的會話cookie
  • 你端的防病毒防火牆會做一些啟發式cookie殺死
  • 服務器上的一些清理工作會導致會話失敗(非常不可能)
  • 服務器上的某些防病毒程序會導致會話失敗(非常不可能)
  • 你是公司線程管理網關的幕后黑手,這些東西可以吃餅干(非常不可能)
  • 有些東西隨機崩潰並重新啟動服務器並在途中終止會話(非常不可能)
  • javascript可能會干擾你的會話cookie(非常不可能)

首先,檢查請求標頭中是否正確設置了SET-COOKIE 檢查生命周期(客戶端)。


有時未正確創建有關用戶會話的文件。 檢查session_save_path並檢查此文件夾是否有新文件。

這個問題似乎已經解決了。 它真的是一個隨機和不可預測的事情..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM