[기능] 이중로그인 방지 > 정보공유

본문 바로가기

정보공유

일반글
그누보드팁

[기능] 이중로그인 방지

페이지 정보

게시물QR코드

본문

사이트를 운영중 유료회원들만 이용가능한 사이트가 있다고 한다면

이중로그인 즉 같은 아이디로 여러군데에서 로그인을 할 경우에

하나의 아이디로 여러명이 사용이 가능하기때문에 이부분을 차단할 수 있는 소스를 보도록 하겠습니다.

우선은 www/extend 경로에 login.extend.php 파일을 생성해줍니다.

그렇다면 www/extend/login.extend.php 이렇게 파일 경로가 되겠네요.

아래와 같이 소스를 작성 하겠습니다.

<?php

/* www/extend/login.extend.php */


header('Content-type: text/html; charset=utf-8'); 

if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가

if ($member['mb_id']) {

// 내 IP 가 아닌 다른 IP 에서 로그인 한 게 있는가?

$tmp_sql = " select * from {$g5['login_table']} ";

$tmp_sql .= " where mb_id = '{$member['mb_id']}' and lo_ip <> '{$_SERVER['REMOTE_ADDR']}' ";

$tmp_sql .= " order by lo_datetime desc ";

$tmp_row = sql_fetch($tmp_sql);

if ($tmp_row['mb_id']) {

// 다른 데서 로그인 된 정보가 있다..

$tmp_ip_other = $tmp_row['lo_ip']; // 로그인된 다른 곳의 IP

// 중복로그인 저장 테이블을 없으면 만든다.

$g5['login_dup_table'] = G5_TABLE_PREFIX.'login_dup'; // 로그인 중복정보 테이블

if(!sql_query(" DESC {$g5['login_dup_table']} ", FALSE)) {

sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['login_dup_table']}` (

`ld_id` int(11) NOT NULL AUTO_INCREMENT,

`mb_id` varchar(20) NOT NULL,

`ld_datetime` datetime NOT NULL,

`ld_ip_before` varchar(255) NOT NULL,

`ld_ip_after` varchar(255) NOT NULL,

`ld_status` varchar(255) NOT NULL,

PRIMARY KEY (`ld_id`)

) ", FALSE);

}

// 내가 ip_before 에 걸린게 있는지 확인해 본다.

$tmp_sql = " select * from {$g5['login_dup_table']} where mb_id = '{$member['mb_id']}' and ld_ip_before = '{$_SERVER['REMOTE_ADDR']}' and ld_status = '' ";

$tmp_row = sql_fetch($tmp_sql);

if ($tmp_row['mb_id']) {

// 내가 ip_before 에 걸린게 있다. 나를 logout 시킨다.

$tmp_sql = " update {$g5['login_dup_table']} set ld_status = 'logout_before' where ld_id = " . $tmp_row['ld_id'] . " ";

sql_query($tmp_sql, FALSE);

// 여기 IP 에서의 로그인 정보는 지워버린다. => 활동하면 다시 생기므로 지워도 상관없다.

sql_query(" delete from {$g5['login_table']} where mb_id = '{$member['mb_id']}' and lo_ip = '{$_SERVER['REMOTE_ADDR']}' ");

echo "<script>alert('" . $tmp_ip_other . " 에서 로그인 되어서, 현재 세션이 로그아웃됩니다.');</script>";

echo "<script>location.href = '" . G5_BBS_URL ."/logout.php';</script>";

break; // 이걸 해주지 않으면, 어딘가에서 또 한 record 가 삽입되어 버린다.

} else {

// 중복로그인 정보를 입력한다.

$tmp_sql = " insert into {$g5['login_dup_table']} ( mb_id, ld_datetime, ld_ip_before, ld_ip_after ) values ( '{$member['mb_id']}', '".G5_TIME_YMDHIS."', '" . $tmp_ip_other . "', '{$_SERVER['REMOTE_ADDR']}' ) ";

sql_query($tmp_sql, FALSE);

// 다른 IP 에서의 로그인 정보는 지워버린다. => 다른 곳에서 페이지 옮겨 다니면 다시 생기므로 지워도 상관없다.

sql_query(" delete from {$g5['login_table']} where mb_id = '{$member['mb_id']}' and lo_ip <> '{$_SERVER['REMOTE_ADDR']}' ");

echo "<script>alert('" . $tmp_ip_other . " 에서 로그인 된 정보가 있습니다.');</script>";

}

// 오래된 중복로그인 정보는 삭제한다. 14일 이전 데이타는 삭제한다.

sql_query(" delete from {$g5['login_dup_table']} where ld_datetime < '" . date("Y-m-d H:i:s", strtotime("-14 day", time())) . "' ");

}

}

?>


이렇게 extend 폴더안에 php파일을 생성해서 넣게되면
그누보드의 어떠한 페이지를 들어가더라도 해당 파일을 읽어서 실행하고 싶은 코드를 실행합니다.

해당 소스는 db테이블 login_dup를 새로 생성하기때문에 혹여나 테이블이 생성되는것이 싫으신 분이 계신다면
응용을하셔서 다른 테이블의 여분필드들을 활용하셔서 로직을 구현하셔야 합니다.

로그인중에 다른 ip에서 동일 아이디로 접속하게된다면 기존의 접속자는 로그아웃이 됩니다.
이렇게 하시면 현재 최근에 접속한 사람만 사이트를 이용할 수 있습니다.

댓글목록

등록된 댓글이 없습니다.

  • Addr.부산광역시 동구 중앙대로 319, 9층 L4호(초량동, 부산YMCA빌딩) Email. gnuwiz@naver.com
  • BR. 625-68-00172 TRC. 2019-부산해운대-1186 TEL. 0507-1382-2790
All rights reserved.