2011-08-19 6 views
1

PHP에서 세션 ID가 세션간에 지속되는 이유는 무엇입니까?

다음 코드를 고려하십시오.

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

이 페이지를 새로 고칠 때마다 어떻게 세션이 파괴되고 매번 다시 작성 되더라도 동일한 세션 ID를 표시합니까? 세션 파괴시 세션 ID가 지워지지 않았습니까?

EDIT :

좋아하는 답변을 기반으로이 업데이트 된 코드를 사용했지만 세션 ID는 아직 유출되지 않습니다! 어떤 아이디어?

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_start()를 호출해야합니다.

세션을 모두 종료하려면 사용자를 로그 아웃하는 것처럼 세션 ID도 설정 해제되어야합니다. 쿠키가 세션 ID (기본 동작)를 전달하는 데 사용되는 경우 세션 쿠키는 삭제되어야합니다. setcookie()를 사용할 수 있습니다.

예 # 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(); 
?> 

** 업데이트 세션을 파괴 **

:

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

매뉴얼은 코드 예제와 함께 제공

PHP 버전 5.3.6-1 3 리눅스 석회 3.0.0-1-686-PAE # 1 SMP 수요일 8월 17일 세계 협정시 04시 28분 34초 2011는 i686

아파치/2.2.19 (데비안)

세션 설정 (은 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 

업데이트

겠어요 - 다음 설정으로 인해 동일한 문제가 발생합니다.경우, 그리고 난 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(); 

중요 요청 매개 변수로 세션 ID를 SENING있어 경우에만 : 이 설정에 가치있는 세션 하이재킹 [Session fixation]

+0

+1 나를 똑같은 대답으로 때렸다. –

+0

@hakre thanks :) – teemitzitrone

+0

@ maggie- 나는 이것을 시도했지만 작동하지 않았다. 위의 나의 질문 편집을 참조해라. – Yarin

0

이) (당신의 sessionID와

그래서 그냥

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

?> 
+0

이 실제로으로 설명하는 문제입니다 OP. 세션 ID가 유지됩니다. 귀하의 대답은 어떻게 해결됩니까? –

+0

이미 편집되었습니다. 죄송합니다 – genesis

+0

원본 코드와 어떻게 다른가요? – Yarin

관련 문제