세션 DB 연동 후 중복로그인 방지하기 > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

세션 DB 연동 후 중복로그인 방지하기 정보

세션 DB 연동 후 중복로그인 방지하기

본문

그누보드4 세션을 DB 에서 관리하는 방법은 아래 주소에 있습니다.
http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=17451

위 팁을 적용한 뒤 중복로그인을 방지 하는 방법에 대해 설명해드리겠습니다.
우선 세션 DB 테이블에 두가지 필드를 추가해야 합니다.

ALTER TABLE `g4_session` ADD `ss_ip` VARCHAR( 20 ) NOT NULL AFTER `ss_data` ;
ALTER
TABLE `g4_session` ADD `mb_id` VARCHAR( 20 ) NOT NULL AFTER `ss_data` ;

회원아이디(mb_id) 와 아이피(ss_ip) 필드를 추가하였습니다.
속도 향상을 위하여 index 도 걸어줍니다.

ALTER TABLE `g4_session` ADD INDEX `mb_id` ( `mb_id` , `ss_ip` );

이제 기존 세션 DB 라이브러리를 수정해야 합니다.
lib/mw.session.db.lib.php 파일을 열어 mw_session_write() 함수를 아래와 같이 변경합니다.
좀전에 추가한 필드에 값을 채우는 역할을 합니다.

function _mw_session_write($id, $data)
{
    global $connect_db, $mw, $g4;

    $id = mysql_real_escape_string($id);
    $ss_data = mysql_real_escape_string($data);
    $ss_datetime = $g4[time_ymdhis];

    $sql = "replace into $g4[session_table] values ('$id', '$ss_datetime', '$ss_data', '$_SESSION[ss_mb_id]', '$_SERVER[REMOTE_ADDR]')";
    $qry = sql_query($sql, false);

    return $qry;
}


다음은 skin/member/basic/login_check.skin.php 파일을 수정해야 합니다.
중복로그인을 체크하는 부분입니다.

아래 코드를 추가해주세요.

// 중복로그인 체크
// 10분 이내에 같은 아이디, 다른 아이피가 존재하는지 확인
$login_time = date("Y-m-d H:i:s", $g4[server_time] - 60*10); // 10분
$sql = "select * from $g4[session_table] where mb_id = '$mb[mb_id]' and ss_ip != '$_SERVER[REMOTE_ADDR]' and ss_datetime > '$login_time' ";
$sql.= "order by ss_datetime desc limit 1";
$row = sql_fetch($sql);
if ($row) {
    alert("다른 컴퓨터에서 로그인 되어 있습니다.");
}  

// 로그인하면서 같은 아이디 - 다른 세션 데이터를 삭제한다.
sql_query("delete from $g4[session_table] where mb_id = '$mb[mb_id]'");

- 끝 -

 

추천
7

댓글 17개

테이블, 파일 업데이트 이상없이 했는데 이 팁을 적용후 로그인이 안되네요..

replace into g4_session values ('bac6cccb9dd8adb87c683568', '2008-12-11 00:53:41', 'ss_token|s:32:\"a2883160590dadb8769e8780a\";')

1136 : Column count doesn't match value count at row 1
function _mw_session_write($id, $data)
{
    global $connect_db, $mw, $g4;
    $id = mysql_real_escape_string($id);
    $ss_data = mysql_real_escape_string($data);
    $ss_datetime = $g4[time_ymdhis];
    $sql = "replace into $mw[session_table] values ('$id', '$ss_datetime', '$ss_data', '$_SESSION[ss_mb_id]', '$_SERVER[REMOTE_ADDR]')";
    $qry = sql_query($sql, false);
    return $qry;
}

replace를 하는 sql 문장에서 mb_id와 ip가 빠졌어요. 파일을 확인해보심이 ^^
지금보니까 배추님 환경변수 $mw가 문제네요.
저의 ctrl+~~ 의 고질병입니다.ㅋㅋ

function _mw_session_write($id, $data)
{
    global $connect_db, $g4;

    $id = mysql_real_escape_string($id);
    $ss_data = mysql_real_escape_string($data);
    $ss_datetime = $g4[time_ymdhis];
    $sql = "replace into $g4[session_table] values ('$id', '$ss_datetime', '$ss_data', '$_SESSION[ss_mb_id]', '$_SERVER[REMOTE_ADDR]')";
    $qry = sql_query($sql, false);
    return $qry;
}

또하나 필드추가 저대로 붙이면 ss_ip mb_id 순의로 생성되네요.
한번에 붙여넣으려면 필드추가 행을 바꿔서 넣어야 됩니다.
ss_data 뒤에 넣으라고 되있으니까요.. ㄷㄷㄷ
유료사이트의경우, 중복로그인에 때문에 문제가 간혹 있곤 하는데 좋은 팁이군요.
아예..그누소스에 장착이 되어 적용되면 더할 나위없이 좋을듯 하군요~
// 1분 이내에 같은 아이디, 다른 아이피가 존재하는지 확인
$login_time = date("Y-m-d H:i:s", $g4[server_time] - 60*1); // 1분

1분 이내로 하면 문제가 될까요 ?
아주 유용하게 잘 사용하고 있었습니다만
언제부터인가 로그인한 한사람의 세션이 수백~수만개까지 생성되더군요

어디의 문제인지 도무지 알수 가 없습니다.
utf-8 인경우 lib파일은 utf8로 변환했고
db 테이블생성도 collation 을 utf8_general_ci로 해놨습니다.
db부터 하나하나 따라했는데
로그인하면 DB 테이블에 값이 안들어가요~
전체 44 |RSS
그누4 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT