2015-04-07 110 views
0

我一直在嘗試在線搜索可能的答案這個問題,但我真的無法弄清楚。有很多人有類似的問題,但我有一個獨特的觸摸,我不明白,也沒有在其他地方遇到過。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根目錄之外,但是如果我將它們放回到根目錄中,問題就不會解決,所以我猜測可以不是問題。
+2

刪除'session_regenerate_id(真)'你不想重新生成會話ID。讓PHP處理所有會話ID的東西。你應該有一個'$ _SESSION ['myid']'',它保存你想要的數據庫項的關鍵字。 – Tschallacka

+0

謝謝,但根據我提到的教程,重新生成會話ID更安全; 「此外,」session_regenerate_id()「函數可在每次重新加載頁面時重新生成會話ID,有助於防止會話劫持。」這是真的,還是最好不要再生? –

+1

好吧,看看它這樣...用戶請求:給我那個頁面。您的網站:好的訪客aeb123。遊客。好吧,我給你。您的網站。哈哈,我會打電話給你。下一個請求。你好網站,im aeb123。您的網站我不知道任何aeb123。我只知道dude123。爲了防止會話劫持,請使用長會話ID。他們很難在會議結束前及時暴力破解。如果將一分鐘超過100次的請求發送到同一頁面,您就可以將這項功能與防洪功能相結合,從而節省用戶的體力。 – Tschallacka

回答

0

我實際上通過編輯代碼的再生片解決了這個問題。刪除再生不起作用,但我通過設置我忘記改變的參數(即生命期,路徑和域)並從session_regenerate_id()中刪除參數「true」來修復它。命令(我直接從教程中複製粘貼了這段代碼,但在進行所有更改時未注意到這些事情)。

不過,我還是很好奇的var_dump如何能夠避免這個問題..