home |
[3002]
제목 codeignite 에서 session 라이브러리 버그
등록일 2010.10.13 HIT 1664 작성자 폰돌
codeignite 에서 제공하는 Session Class는 sess_expiration에서 치명적인 버그가 있다.
브라우저를 닫아도 세션이 존재한다는 것이다. 그 이유는 세션처리가 쿠키로서 존재하기 때문에 발생하는 에러이다.

/system/application/config/config.php 에서 
$config['sess_expiration'] 을 잡아주게 되는데
$config['sess_expiration'] = 0 일경우는 무한대(엄격히 말하면 2년) 이라는 값이 잡힌다.
그리고 일정한 시간을 넣어 주게되면 (예, $config['sess_expiration']        = 7200;)
브라우저를 닫아도 세션이 남아 있었어 여러가지 문제를 초래하게 된다.
어떤 이는 -1을 넣는 경우도 있는데 이경우도 특정경우에 있었어 세션은 바로 닫혀 버리는 문제점이 발생한다.

그래서 아래와 같은 patch를 해주시기 바랍니다.

참조 : http://codeigniter.com/forums/viewthread/109645/#553043



1. /system/application/config/config.php 에서 
$config['sess_expiration']        = 7200; 아래에 다음을 추가한다. 
$config['sess_persistant_cookie']     = TRUE; 


2. /system/libraries/Session.php 를 다음과 같이 각각 수정한다.

2_1 : 
foreach (array (
                'sess_encrypt_cookie',
                'sess_use_database',
                'sess_table_name',
                'sess_expiration',
        'sess_persistant_cookie', <!--추가
                'sess_match_ip',
                'sess_match_useragent',

2_2 : 
function _set_cookie($cookie_data = NULL) {
        if (is_null($cookie_data)) {
            $cookie_data = $this->userdata;
        }

        // Serialize the userdata for the cookie
        $cookie_data = $this->_serialize($cookie_data);

        if ($this->sess_encrypt_cookie == TRUE) {
            $cookie_data = $this->CI->encrypt->encode($cookie_data);
        } else {
            // if encryption is not used, we provide an md5 hash to prevent userside tampering
            $cookie_data = $cookie_data . md5($cookie_data . $this->encryption_key);
        }
        
        // Session or persistant cookie...
        
        //아래부분 추가
        $expiration = $this->sess_expiration + time();   
        // We want the cookie to expire when browser session closes
        if ($this->sess_persistant_cookie == FALSE)
        {
            $expiration = 0;
        }
        // Set the cookie
    // 기존 $this->sess_expiration + time() -> $expiration 으로 변경
        setcookie($this->sess_cookie_name, $cookie_data, $expiration, $this->cookie_path, $this->cookie_domain, 0);
    }  


이렇게 변경하시면 됩니다.

그리고 브라우저가 닫힐때 세션을 없애고 싶으시면
$config['sess_persistant_cookie']     = TRUE;//  을 FALSE로 하시면됩니다.
댓글보기 엮인글보기
  • 글쓴이
  • 비밀번호
  • 등록