我一直在嘗試在線搜索可能的答案這個問題,但我真的無法弄清楚。有很多人有類似的問題,但我有一個獨特的觸摸,我不明白,也沒有在其他地方遇到過。PHP會話重置刷新
我創建了一個工作正常的登錄系統。不過,我想讓它更安全,所以我使用了本教程:http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL。我仍然可以登錄,但每當我刷新頁面時,我都會自動註銷。過了一段時間後,我發現會話ID發生了變化。
好奇的是,當我調用var_dump($ _ SESSION);在我的代碼的第三行(直接在session_start();之後),會話ID保持不變,並且一切正常。只要我評論這一行,問題就會返回。
我用下面的代碼重新生成會話ID:
$session_name = 'robinator123'; // Set a custom session name
$secure = FALSE;
// This stops JavaScript being able to access the session id.
$httponly = true;
// Forces sessions to only use cookies.
if (ini_set('session.use_only_cookies', 1) === FALSE) {
header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
exit();
}
// Gets current cookies params.
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"],
$cookieParams["path"],
$cookieParams["domain"],
$secure,
$httponly);
// Sets the session name to the one set above.
session_name($session_name);
session_start(); // Start the PHP session
session_regenerate_id(true); // regenerated the session, delete the old one.
當我打電話的var_dump($ _ SESSION);,因爲頭已經被髮送的var_dump再生失敗。但是,當我用正常的echo語句替換var_dump時,標題也會失敗,但會話標識仍然會更改。我不知道發生了什麼事。
的幾個注意事項:
- 我沒有忘記調用session_start();在我的代碼開始
- 我用來存儲會話變量的包含的php代碼位於我的web根目錄之外,但是如果我將它們放回到根目錄中,問題就不會解決,所以我猜測可以不是問題。
刪除'session_regenerate_id(真)'你不想重新生成會話ID。讓PHP處理所有會話ID的東西。你應該有一個'$ _SESSION ['myid']'',它保存你想要的數據庫項的關鍵字。 – Tschallacka
謝謝,但根據我提到的教程,重新生成會話ID更安全; 「此外,」session_regenerate_id()「函數可在每次重新加載頁面時重新生成會話ID,有助於防止會話劫持。」這是真的,還是最好不要再生? –
好吧,看看它這樣...用戶請求:給我那個頁面。您的網站:好的訪客aeb123。遊客。好吧,我給你。您的網站。哈哈,我會打電話給你。下一個請求。你好網站,im aeb123。您的網站我不知道任何aeb123。我只知道dude123。爲了防止會話劫持,請使用長會話ID。他們很難在會議結束前及時暴力破解。如果將一分鐘超過100次的請求發送到同一頁面,您就可以將這項功能與防洪功能相結合,從而節省用戶的體力。 – Tschallacka