簡體   English   中英

為什么php每次都在測試環境(WAMP)中生成相同的會話id?

[英]why is php generating the same session ids everytime in test environment (WAMP)?

我已經在我的系統中配置了wamp,並且正在本地環境中進行開發和測試。 我正在研究注銷功能,並且碰巧注意到生成的會話ID在瀏覽器中是相同的。

例如 - 即使在注銷並登錄后,chrome也會為所有用戶生成會話ID = abc; IE總是為所有用戶生成session id = xyz。

這是wamp /我的測試環境的問題嗎?

請在下面找到我的注銷php腳本 -

<?php
session_start();
$sessionid = session_id();
echo $sessionid;
session_unset(); 
session_destroy(); 
?>

您可能仍然擁有包含舊會話ID的cookie,因為session_unsetsession_destroy都沒有刪除該cookie:

為了完全終止會話,比如要將用戶注銷,還必須取消設置會話ID。 如果使用cookie來傳播會話ID(默認行為),則必須刪除會話cookie。 setcookie()可能會用於此。

因此,在注銷后使用setcookie使會話ID cookie無效:

if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

另一個建議是使用session_regenerate_id(true)在成功驗證后重新生成會話ID。

將工作。 請試試這個

session_start(); 
session_regenerate_id(TRUE); 
session_destroy(); 

您必須使用函數session_regenerate_id()重新生成會話ID。 沒有它,會話ID在頁面刷新之間是相同的。

session_destroy()銷毀與當前會話關聯的所有數據。 它不會取消設置與會話關聯的任何全局變量,也不會取消設置會話cookie。 要再次使用會話變量,必須調用session_start()。

為了完全終止會話,比如要將用戶注銷,還必須取消設置會話ID。 如果使用cookie來傳播會話ID(默認行為),則必須刪除會話cookie。 setcookie()可能會用於此。

取自http://php.net/manual/en/function.session-destroy.php

session_unset()session_destroy()不會刪除會話cookie。 您必須使用setcookie()調用手動取消設置它。

session_unset與session_register()相反,session_destroy只是清除$ _SESSION而不影響cookie。

手冊 (session_destroy):

session_destroy()銷毀與當前會話關聯的所有數據。 它不會取消設置與會話關聯的任何全局變量,也不會取消設置會話cookie。 要再次使用會話變量,必須調用session_start()。

為了完全終止會話,比如要將用戶注銷,還必須取消設置會話ID。 如果使用cookie來傳播會話ID(默認行為),則必須刪除會話cookie。 setcookie()可能會用於此。

除非您專門取消設置cookie,否則cookie仍然存在,並且下次調用session_start()時,它將使用它作為會話ID。 關閉瀏覽器也應該清除cookie,因為它們通常由php設置為在瀏覽器關閉時到期。

要停止會話劫持,請按照PHP中的以下代碼進行操作

    session_start();

    /* to stop session hijacking */

    // Generate new session without destroying the old one
    session_regenerate_id(false);

    // Fetch current session ID and close both sessions to allow other scripts to use them
    $newSession = session_id();
    session_write_close();

    // Assign session ID to the new one, and start it back up again
    session_id($newSession);

    session_start();

暫無
暫無

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

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