세션공유에 대해 아시는분 1차도메인과 1차도메인과의 세션공유 > 그누3질답

그누3질답

세션공유에 대해 아시는분 1차도메인과 1차도메인과의 세션공유 정보

그누보드 세션공유에 대해 아시는분 1차도메인과 1차도메인과의 세션공유

본문

카페형식의 지원이 가능토록 그누보드를 수정중인데...
HOME--+---test-+----www-+-----gnu2
                        |              + index.html
                        +----cafe--+-----카페명-+ index.html
이런구도의 2차도메인지원 디렉토리에서     
1차 도메인은 www.test.com/index.html
2차 도메인은 cafe.test.com/카페명/index.html
이런구도인데 중요한건 로그인 세션이 /home/test/www/gnu2/data/file/session
에 저장되어서 2차도메인 cafe.test.com/카페명/index.html는 전혀 변수를 읽을수가 없군요!
이걸 해결해야하는데 세션변수를 공유하던지 아니면 2차 도메인에 세션변수를 생성되어야할것같은데
세션공유가 맞을것 같은데 방법이 없을까요?
혹시 아시는분
스쿨버스에 세션공유방법이 있는데 세션에 아는게 없어서 어케 적용시켜야할지를 모르겠습니다.
고수님들의 많은 조언 부탁드립니다.

phpschools  TarauS님의 글
 (http://www.phpschool.com/bbs2/inc_view.html?id=8937&code=tnt2&start=0&mode=search&field=title&operator=and&period=last1year&category_id=&s_que=%BC%BC%BC%C7)

안녕하세요...바로 밑에서 세션 공유에 대한 글을 올렸던 TarauS입니다.
제가 올렸던 글에 대해서 많은 분들이 좋은 의견들을 남겨 주셔서 그 글을 참고하여
보안부분을 조금 더 강화한 소스를 다시 올립니다.

달라진 점이라면 그전에는 세션키만을 전송하였기에 세션키만 알아내면 뚫을 수 있는 취약점이 있었으나 이번에는 세션키를 검증할 수 있는 암호화된 키를 함께 체크합니다.
암호화된 키는 사용자가 고유하게 가지는 값들을 암호화 한 값으로 따로 전송할 필요는 없습니다.(사용자의 환경값이나 아이피값을 가지고 만드는 것이기 때문에 한 사용자가 계속 사용중이라면 변하지 않을테니까요^^)
결론적으로 세션키는 예전처럼 iframe를 이용해서 전송하고 그 대신 DB와의 쿼리 부분에 사용자키도 함께 넣어 체크하도록 한 것입니다.
그리고 또한 레퍼러 및 세션키를 받아서 설정하는 파일명도 함께 체크하도록 하여 조금이라도 보안적으로 강력해지도록 노력하였습니다.
이번 수정된 소스를 보시고 또 여러 의견 남겨 주시기 바랍니다.

아~ 그리고...사용자키를 암호화하는 함수는 넣지 않았습니다... 이 부분은 여러분들이 찾아서 넣으시기 바랍니다.^^

설정에 관련된 것은 밑의 게시물을 열어서 보시기 바랍니다. 참고만 하시고 session.inc 파일의 소스는 지금 올린 것을 사용하세요.
http://www.phpschool.com/bbs2/inc_view.html?id=8923&code=tnt2&start=0&mode=&field=&operator=&period=&category_id=&s_que=

############## session.inc 파일 ###################################################
<?
header('P3P: CP="NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE"');
/* ------------------------------------------------------------------------
Table Scheme

CREATE TABLE sessions (
    session_key char(32) not null,
    session_expiry int(11) unsigned not null,
    session_value text not null,
    session_check varchar(250) not null,
    PRIMARY KEY (session_key)
);
*/

#### DB 관련설정
$Cfg_DB_Host = "db_host";
$Cfg_DB_User = "db_user";
$Cfg_DB_Pass = "db_pass";
$Cfg_DB_Name = "db_name";

#### 쿠키 관련 설정
$Cfg_Cookie_Domain = ".aaa.com";

#### 보안 관련 설정
## 상대편 서버에서 현재 서버의 link.php 파일을 아이프레임으로 호출하는 파일
$Cfg_Http_Referer = "http://www.bbb.com/member/login_process.php";
## 현재 서버에서 상대편 서버로부터 넘어오는 세션키를 받는 파일
$Cfg_Php_Self = "/member/link.php";

#### 세션 관련 기본 설정
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");

#### 세션키의 유효성을 체크하기 위한 사용자 키
#### 사용자 키는 사용자가 고유하게 가지는 값들을 이용하여 만들어주면 됨
## 서버키를 설정 (이 값은 아무것이나 정하시면 됩니다.)
$SERVER_KEY = "~1234567890";
## 사용자의 접속 환경
$USER_AGENT = $_SERVER["HTTP_USER_AGENT"];
## 사용자의 접속 아이피
$USER_ADDR  = $_SERVER["REMOTE_ADDR"];
## 사용자 키 (각각의 정보를 이용한 조합은 여러분들이 직접 정하세요. 여기서 보여드리는 것은 예시입니다.)
$USER_KEY  = $USER_AGENT."||".$USER_ADDR."||".$SERVER_KEY;

#### 암호화 함수(유일한 암호화 함수를 직접 제작함)
function encrypt($key) {
## 이부분에 암호화 루틴을 넣으면 됨 ##
}

#### 암호화 함수를 통해 인코딩된 사용자 키 값
$ENCODE_KEY = encrypt($USER_KEY);

function sess_open($save_path, $session_name){
    global $SESS_DBH,$Cfg_DB_Host,$Cfg_DB_User,$Cfg_DB_Pass,$Cfg_DB_Name;

    $SESS_DBH = mysql_pconnect($Cfg_DB_Host,$Cfg_DB_User,$Cfg_DB_Pass) or die("SQL 서버에 접속할 수 없습니다.");
    mysql_select_db($Cfg_DB_Name, $SESS_DBH) or die("SQL 서버에 접속할 수 없습니다.");

    return true;
}

function sess_close(){
    return true;
}

function sess_read($key){
    global $SESS_DBH, $SESS_LIFE,$ENCODE_KEY;

    $qry = "SELECT session_value FROM sessions WHERE session_key = '$key' AND session_check='$ENCODE_KEY' and session_expiry > " . time();
    $qid = mysql_query($qry, $SESS_DBH);

    if (list($value) = mysql_fetch_row($qid)) {
        return $value;
    }

    return false;
}

function sess_write($key, $val){
    global $SESS_DBH, $SESS_LIFE, $ENCODE_KEY;

    $expiry = time() + $SESS_LIFE;
    $value = addslashes($val);

    $qry = "INSERT INTO sessions (session_key,session_expiry,session_value,session_check) VALUES ('$key', $expiry, '$value', '$ENCODE_KEY')";
    $qid = mysql_query($qry, $SESS_DBH);

    if (! $qid) {
        $qry = "UPDATE sessions SET session_expiry = $expiry, session_value = '$value' WHERE session_key = '$key' AND session_check='$ENCODE_KEY' AND session_expiry > " . time();
        $qid = mysql_query($qry, $SESS_DBH);
    }

    return $qid;
}

function sess_destroy($key){
    global $SESS_DBH,$USER_KEY;

    $qry = "DELETE FROM sessions WHERE session_key = '$key' AND session_check='$ENCODE_KEY'";
    $qid = mysql_query($qry, $SESS_DBH);

    return $qid;
}

function sess_gc($maxlifetime){
    global $SESS_DBH;

    $qry = "DELETE FROM sessions WHERE session_expiry < " . time();
    $qid = mysql_query($qry, $SESS_DBH);

    return mysql_affected_rows($SESS_DBH);
}

#### 세션키를 설정하는 함수
function set_session_id($SESSID){
    global $HTTP_REFERER, $PHP_SELF;
    ## 레퍼러 및 현재 파일명을 함께 체크해서 제대로 된 요청일 때만 세션키를 설정
    if($SESSID&&$HTTP_REFERER==$Cfg_Http_Referer&&$PHP_SELF==$Cfg_Php_Self) @session_id($SESSID);
}

set_session_id($SESSID);
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
session_set_cookie_params(0, "/", $Cfg_Cookie_Domain);
ini_set('session.cache_limiter' ,'nocache, must-revalidate-revalidate');
session_start();
?>
  • 복사

댓글 전체

수정하여 쪽지 보내드렸습니다.
테스트는 http://bbs.php.st 에서 해보실수 있습니다.
오늘 인터넷이 안되는 바람에 지금에서야 작업을 할수 있었네요.
그럼 전 이만 잠자리로..~ 슝  =3=3=3
아직 카페형식소스는 부족한게 많아서 공개할정도는 되지않는듯싶습니다. 하지만 곧 공개할생각입니다.
세션과 쿠키에대해서 너무 아는게 없습니다. php를 전혀모르는 상태에서 만진지 3-4개월정도밖에 되지않습니다.
그냥 그누보드 2.42버젼이나 2.50버젼을 기준으로 1차도메인에 그누보드를 설치하고 2차도메인에서 1차도메인에 설치된 그누보드의 외부로그인을 include하여 사용할수 있는방법을 샘플형식으로 알려주시면 안될지요?
그리고 카페형식으로 소스를 보고싶다면  이멜로 소스다운위치를 알려드리겠습니다.
위에 방식을 해보니..쩝...아무래도 책을 마니 찾아봐야할것 같네요...쩝
다시 한번 테스트 해보니
session_id($SID); 문구는
session_save_path("{$reldir}$cfg[dir_session]"); 문장 이전에 아래와 같으 넣어 주셔야 에러가 안나오네요.
if(!empty($SID)) session_id($SID);

그롬...~
그렇다면 일단 쿠키가 잘 동작 하는지부터 테스트를 해보시는 것이 순서일듯 하군요.
세션도 쿠키를 사용하니까 세션 아이디를 쿠키가 아닌 GET방식으로 2차도메인,1차도메인으로 넘겨주는 방식으로 테스트 해보세요.
세션 아이디 구하고 설정하는 함수 입니다...
string session_id ( [string id])
예를 들면 lib.inc.php의 마지막 부분에서 $qstr 에 세션 아이디를 넘겨주는 부분 을 아래와 같이 만들고.
$qstr .= "&SID=a".session_id();
받아서 설정 하는 부분 28,29번째줄에 아래와 같이 세션 시작 하기 전에 설정을 해보세요.
session_id($SID);
session_start() ;

소스라도 있으면 제가 테스트를 해보겠는데 없으니 이렇게라도 도와 드리네요.. ^^;
그럼 성공 하시기를...
당연히 로그인체크시는 $member{md_id]변수값을 확인해서 로그인 로그오프를 표시하는데 실제적으로는 로그인되어있으나 저변수를 사용해서 로그인을 표시하기때문에 결국은 로그오프되어있는듯 나옵니다. *^^*
쿠쿠쿠*^^* 실제적으로 현재 절대값이 들어가 있는상태이고 로그인까지 이상없이 됩니다.
그리고 1차도메인안에 그누보드가설치되어 있고 2차도메인에는 그누보드가 설치되어있지 않습니다.
정확히 2차도메인에서 1차도메인에 들어있는 게시판을 사용할뿐입니다.
1차도메인에서는 로그인후에 로그인후 $member[mb_id]변수값이 제대로 넘어오고
2차도메인안에서는 $member[mb_id]변수값이 넘어오지를 않습니다. *^^* 다른방법이 없을까요?
저의 짧은 색각으로는 세션을 디비에 넣는 것 보다는
간단하게 세션 디렉토리를 절대 경로로 지정을 하면 될것 같은데요..
lib.inc.php 19번째 중을 보시면
session_save_path("{$reldir}$cfg[dir_session]");
라고 있지요.
이 부분을 절대경로로 지정해보세요.

예를 들면
session_save_path("/home/test/www/gnu2/data/file/session");

이런식으로요..
2차도메인에 깔으신 게시판 설정이랑 본 도메인에 깔은 게시판이랑
경로만 같다면 문제 없을듯 합니다.
© SIRSOFT
현재 페이지 제일 처음으로