我正在嘗試確保用戶在網站上的會話安全。 在登錄流程中,我正在重新生成會話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會話文件:odu7sttll7pp43suqu22laa755和27po8j6bu318fd3e69ug4m53i3 因此,函數說的話,它的作用。 但是,我的問題來到這裏(對不起長頭介紹),在第一種情況下,當使用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)
瀏覽器處理cookie,當服務器生成一個新的會話ID時,服務器發回一個新的cookie,瀏覽器接受cookie(或不是,取決於瀏覽器的設置),當你發出新的請求時,瀏覽器發回新的cookie。 –
此外,如果您使用緩存,則瀏覽器可以在緩存中使用其Cookie,而不是使用新的Cookie。重新生成會話時,嘗試使用CTRL + R來刷新而不使用緩存。 – AnthonyB
@AnthonyB有趣的一點。我從來沒有遇到過使用緩存中的cookie的瀏覽器,但我會深入研究這一點。 –