php 중복 로그인 방지
몇년전 중복로그인 방지를 해야하는일이 있어 만들었던 소스입니다. 정확히는 A-pc에서 로그인했을때 B-pc에서 로그인이 되지 않는게 아니라, A-pc에서 로그인했을때 B-pc에서 로그인하면 2군데 모두 세션이 없어지고 로그아웃 처리되는 개념입니다. 스쿨에 괴수분들이 많아서 팁아닌 팁 올리는게 부끄럽네요;
<?php
/**
CREATE TABLE `avoid_duplication` (
`idx` int(11) NOT NULL AUTO_INCREMENT,
`mem_idx` int(11) DEFAULT NULL, # 회원의 index
`sess_id` varchar(100) DEFAULT NULL, # 세션아이디 (회원의 아이디 아님.)
`wrt_date` int(11) DEFAULT NULL, # 등록일 time()
`ip` varchar(255) DEFAULT NULL, # 아이피.
PRIMARY KEY (`idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `member_block` (
`mb_idx` int(11) NOT NULL AUTO_INCREMENT,
`mem_idx` int(11) DEFAULT NULL, # 회원의 index
`mem_wrt_date` int(11) DEFAULT NULL, # 차단된 날짜 time()
`mb_code` varchar(255) DEFAULT NULL, # 차단해제 신청시 인증번호 체크
PRIMARY KEY (`mb_idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
$sess_uidx : 회원의 index를 세션값으로..
* */
Class AvoidDuplication extends DB
{
var $TBL = "avoid_duplication";
function __construct()
{
$this->ezSQL_mysql(
DBUSER,
DBPW,
DBNAME,
DBHOST
);
}
function bloackChk($sess_uidx)
{
$sql = "select count(*) as cnt from member_block where mem_idx = '{$sess_uidx}'";
$cnt = $this->get_row($sql)->cnt;
if ($cnt!=0)
{
//alert("중복로그인으로 인해 블럭처리된 아이디입니다.\\n관리자에게 문의주시거나, \'중복로그인해지신청\'을 해주세요.");
//location.href = 'logout.php';
}
}
function processing()
{
global $sess_uidx;
$nowTime = time();
$IP = $_SERVER["REMOTE_ADDR"];
$this->bloackChk($sess_uidx);
$sql = "SELECT * FROM {$this->TBL} WHERE mem_idx = '{$sess_uidx}'";
$row = $this->get_row($sql);
$resTime = $nowTime - $row->wrt_date;
$time = 60*10;
if ($sess_uidx)
{
if ($row->mem_idx=="")
{
$sql = "INSERT INTO {$this->TBL} (mem_idx, ip, wrt_date) VALUES ('{$sess_uidx}','{$IP}','{$nowTime}')";
$this->query($sql);
}
else
{
if ($row->ip!=$IP)
{
if ($resTime < $time+1)
{
// 블럭처리
$sql ="INSERT INTO member_block (mem_idx, mem_wrt_date) VALUES ('{$sess_uidx}','$nowTime')";
$this->query($sql);
}
else
{
$sql = "UPDATE {$this->TBL} SET wrt_date = '{$nowTime}',ip = '{$IP}' WHERE mem_idx = '{$sess_uidx}'";
$this->query($sql);
}
}
else
{
// do noting
}
}
}
else
{
// do noting
}
}
function processingStop()
{
global $sess_uidx;
$sql = "delete from {$this->TBL} where mem_idx = '{$sess_uidx}'";
$this->query($sql);
}
// 인증번호 생성하여 발송하고 '차단'테이블에 인증번호 입력.
function duplication($mem_id,$mem_pw,$mem_ssn1,$mem_ssn2,$mem_mail1,$mem_mail2)
{
global $sess_uidx;
$sql = "
SELECT *, count(*) AS cnt FROM member WHERE
mem_id = '$mem_id' AND
mem_pw = '$mem_pw' AND
mem_ssn1 = '$mem_ssn1' AND
mem_ssn2 = '$mem_ssn2' AND
mem_mail1 = '$mem_mail1' AND
mem_mail2 = '$mem_mail2'
";
$row = $this->get_row($sql);
if ($row->cnt!=0)
{
$key = rand(0,9999);
$sql = "UPDATE member_block SET mb_code = '$key' WHERE mem_idx = '$row->mem_idx'";
$res = $this->query($sql);
if ($res)
{
// 이곳에서 인증번호를 메일이나 문자로 발송. 인증번호는 $key 변수.
echo true;
}
}
}
// 차단 해제.
function duplicationDel($mem_id, $mb_code)
{
global $sess_uidx;
$sql = "SELECT * FROM member WHERE mem_id = '{$mem_id}'";
$row = $this->get_row($sql);
$row->mem_idx;
$sql = "SELECT count(*) AS cnt FROM member_block WHERE mem_idx = '$row->mem_idx'
AND mb_code = '$mb_code'";
$cnt = $this->get_row($sql)->cnt;
if ($cnt!=0)
{
$sql = "DELETE FROM member_block WHERE mem_idx = '$row->mem_idx'
AND mb_code = '$mb_code'";
$res = $this->query($sql);
echo true;
}
else {
echo false;
}
}
}
$aDupli = new AvoidDuplication();
$aDupli->processing();
// 사용시
//$aDupli->bloackChk($sess_idx);
?> |