2011-08-19 25 views
1

考慮下面的代碼:爲什麼會話ID在PHP中的會話中持續存在?

<?php 
    if (!session_id()) 
     session_start(); 
    echo session_id(); 
    session_destroy(); 
?> 

爲什麼每次我刷新此頁面它顯示了相同的會話ID,即使會話被破壞,每次重現?會話銷燬時會不會清除會話ID?

編輯:

我不過用這個更新的代碼的基礎上,最喜歡的答案 - ,會話ID STILL perists!有任何想法嗎?

if (!session_id()) 
     session_start(); 
echo session_id(); 

// Unset all of the session variables. 
$_SESSION = array(); 


// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 

回答

6

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

爲了完全消除會話,就像登錄用戶一樣, 會話ID也必須取消設置。如果使用cookie傳播會話ID(默認行爲),那麼會話cookie必須被刪除,其中 。 setcookie()可用於此目的。

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

手動帶有一個代碼例如:

實施例#1銷燬用$ _SESSION

<?php 
// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 
?> 

**更新會話**

PHP版本5.3.6-1 3 Linux的石灰3.0.0-1-686-PAE#1 SMP星期三年08月17 4時28分34秒UTC 2011的i686

的Apache/2.2.19(Debian的)

會話設置(的phpinfo)

Directive   Local Value   Master Value 
session.auto_start   Off   Off 
session.bug_compat_42   Off   Off 
session.bug_compat_warn   Off   Off 
session.cache_expire   180   180 
session.cache_limiter   nocache   nocache 
session.cookie_domain   no value   no value 
session.cookie_httponly   Off   Off 
session.cookie_lifetime   0   0 
session.cookie_path  /  /
session.cookie_secure   Off   Off 
session.entropy_file   no value   no value 
session.entropy_length   0   0 
session.gc_divisor   1000   1000 
session.gc_maxlifetime   1440   1440 
session.gc_probability   0   0 
session.hash_bits_per_character   5   5 
session.hash_function   0   0 
session.name   PHPSESSID   PHPSESSID 
session.referer_check   no value   no value 
session.save_handler   files   files 
session.save_path   /var/lib/php5   /var/lib/php5 
session.serialize_handler   php   php 
session.use_cookies   On   On 
session.use_only_cookies   On   On 
session.use_trans_sid   0   0 

更新

所以。以下設置導致相同的問題。當且僅如果我sening會話ID作爲請求參數locahost?PHPSESSID=whatever

ini_set('session.auto_start', 'on'); 
ini_set('session.use_trans_sid', 'on'); 
ini_set('session.use_cookies', 'off'); 
ini_set('session.use_only_cookies', 'off'); 

if(!session_id()) 
    session_start(); 

echo session_id(); 
// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 

重要: 這個設置是有價值的會話劫持[Session fixation]

+0

+1擊敗我的同一個答案。 –

+0

@hakre謝謝:) – teemitzitrone

+0

@ maggie-我試過,但沒有工作 - 請參閱我上面的問題編輯。 – Yarin

0

它不會破壞你的會話ID

所以你最好只使用

<?php 
    session_start(); 
    echo session_id(); 
    session_destroy(); 

?> 
+0

這實際上是通過所描述的問題OP。這是會話ID是持久的。你的答案如何解決這個問題?已編輯 –

+0

。對不起 – genesis

+0

這與我原來的代碼有什麼不同? – Yarin