2016-12-18 136 views
1

我正在嘗試確保用戶在網站上的會話安全。 在登錄流程中,我正在重新生成會話ID,以確保在會話固定方面更好的安全性(減少猜測的機會)。我正在嘗試爲session_regenerate_id()的工作測試一個腳本。它有兩個實例。它們是:session_regenerate_id()如何在內部工作?

/var/www/public/goto/index.php:31:int 0 
/var/www/public/goto/index.php:32:string 'q96btv7i1ukpb3cq8tskcgdeb7' (length=26) 

在另一個選項卡(同一瀏覽器):
1)通過使用session_regenerate_id(真)

<?php 
session_start(); 
if (!isset($_SESSION['times'])) { 
    $_SESSION['times'] = 0; 
    $_SESSION['generate'] = true; 
} else { 
    if ($_SESSION['generate'] === true) { 
     session_regenerate_id(true); 
     $_SESSION['generate'] = false; 
    } 
    $_SESSION['times']++; 
} 
var_dump($_SESSION['times']); 
var_dump(session_id()); 
?> 

以下是我得到了它的輸出刪除舊的會話:

/var/www/public/goto/index.php:31:int 1 
/var/www/public/goto/index.php:32:string 'gspq91o1jbcrcc27b4fkm4qgd5' (length=26)

在打開另一個選項卡中的相同頁面後檢查文件夾時,會話fil ES存儲,我發現只有與字符串相關的會議文件:gspq91o1jbcrcc27b4fkm4qgd5

2)剛再生新的會話ID使用session_regenerate_id()

<?php 
session_start(); 
if (!isset($_SESSION['times'])) { 
    $_SESSION['times'] = 0; 
    $_SESSION['generate'] = true; 
} else { 
    if ($_SESSION['generate'] === true) { 
     session_regenerate_id(); 
     $_SESSION['generate'] = false; 
    } 
    $_SESSION['times']++; 
} 
var_dump($_SESSION['times']); 
var_dump(session_id()); 
?> 

輸出的第一個標籤:

/var/www/public/goto/index.php:31:int 0 
/var/www/public/goto/index.php:32:string 'odu7sttll7pp43suqu22laa755' (length=26) 

輸出第二個選項卡:

/var/www/public/goto/index.php:31:int 1 
/var/www/public/goto/index.php:32:string '27po8j6bu318fd3e69ug4m53i3' (length=26) 

在這種情況下,我發現關於該會話ID會話文件:odu7sttll7pp43suqu22laa75527po8j6bu318fd3e69ug4m53i3 因此,函數說的話,它的作用。 但是,我的問題來到這裏(對不起長頭介紹),在第一種情況下,當使用session_regenerate_id(true)時,第一個選項卡上的cookie包含舊會話ID,而新選項卡上的cookie包含新會話ID。 打開第二個選項卡後,當我刷新第一個選項卡時,我奇蹟般地獲得3作爲輸出,第二個選項卡session id。 這裏我不明白的是,當我刷新Tab 1時,它發送給服務器的cookie包含舊的會話ID,該舊的會話ID不應再有效(並且不作爲服務器上的文件存在),我如何獲得3作爲輸出?
即使選項卡1不知道再生和新會話cookie,同一個會話仍然如何保持?
當我刷新標籤頁1 而不是的頁面時,請不要請求新生成的會話(在標籤2上)?
這將在同一個瀏覽器上進行兩個會話,而實際上並不是這樣。如何PHP處理這對session_regenerate_id(true)

請注意:以下是我的會話輸出的phpinfo() php config

+1

瀏覽器處理cookie,當服務器生成一個新的會話ID時,服務器發回一個新的cookie,瀏覽器接受cookie(或不是,取決於瀏覽器的設置),當你發出新的請求時,瀏覽器發回新的cookie。 –

+1

此外,如果您使用緩存,則瀏覽器可以在緩存中使用其Cookie,而不是使用新的Cookie。重新生成會話時,嘗試使用CTRL + R來刷新而不使用緩存。 – AnthonyB

+0

@AnthonyB有趣的一點。我從來沒有遇到過使用緩存中的cookie的瀏覽器,但我會深入研究這一點。 –

回答

0

謝謝@Charlotte杜諾瓦和@AnthonyB幫了我。
這是我的錯誤。
Chrome Dev Tools似乎並未實時更新cookie信息。在檢查設置上的所有網站數據後,我發現我的域只有一個與之關聯的cookie,這是Tab 2的一個。
實際上,當我刷新Tab 1時它確實發送了新的cookie。可能有一個作爲@AnthonyB說的例外(評論)。

在開發工具上,當我爲Tab 1關閉它併爲Tab 1重新打開它時,我發現Cookies選項卡具有更新的值。我再也看不到舊的cookie值。

發現後,即使Cookie信息發生變化,Chrome也不會對Cookie進行實時更新(就像它在頁面元素,樣式中一樣)。
我認爲這也不是必需的。
歡呼聲給大家。