2011-08-19 142 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