세션 DB 연동 후 중복로그인 방지하기 정보
세션 DB 연동 후 중복로그인 방지하기관련링크
http://g4.miwit.com/
537회 연결
본문
그누보드4 세션을 DB 에서 관리하는 방법은 아래 주소에 있습니다.
http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=17451
위 팁을 적용한 뒤 중복로그인을 방지 하는 방법에 대해 설명해드리겠습니다.
우선 세션 DB 테이블에 두가지 필드를 추가해야 합니다.
회원아이디(mb_id) 와 아이피(ss_ip) 필드를 추가하였습니다.
속도 향상을 위하여 index 도 걸어줍니다.
이제 기존 세션 DB 라이브러리를 수정해야 합니다.
lib/mw.session.db.lib.php 파일을 열어 mw_session_write() 함수를 아래와 같이 변경합니다.
좀전에 추가한 필드에 값을 채우는 역할을 합니다.
다음은 skin/member/basic/login_check.skin.php 파일을 수정해야 합니다.
중복로그인을 체크하는 부분입니다.
아래 코드를 추가해주세요.
- 끝 -
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` ;
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;
}
{
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]'");
// 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
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
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가 빠졌어요. 파일을 확인해보심이 ^^
{
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 뒤에 넣으라고 되있으니까요.. ㄷㄷㄷ
저의 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 뒤에 넣으라고 되있으니까요.. ㄷㄷㄷ
헉. 지송합니다. 수정해두었습니다. ^^;
아주 유용할것 같네요 감사합니다.
아래팁부터 여기까지
바로 적용했습니다.
감사드립니다.
바로 적용했습니다.
감사드립니다.
유료사이트의경우, 중복로그인에 때문에 문제가 간혹 있곤 하는데 좋은 팁이군요.
아예..그누소스에 장착이 되어 적용되면 더할 나위없이 좋을듯 하군요~
아예..그누소스에 장착이 되어 적용되면 더할 나위없이 좋을듯 하군요~
다른 컴퓨터에서 로그인 되어 있다고 하면서 관리자도 접속이 안되는군요 ?
한 10분 후에 관리자로 로그인이 되는군요.
혹 관리자 아이디를 취득한 헤커가 ? 무서버요. 덜덜덜덜...
혹 관리자 아이디를 취득한 헤커가 ? 무서버요. 덜덜덜덜...
// 1분 이내에 같은 아이디, 다른 아이피가 존재하는지 확인
$login_time = date("Y-m-d H:i:s", $g4[server_time] - 60*1); // 1분
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 테이블에 값이 안들어가요~
db 테이블생성도 collation 을 utf8_general_ci로 해놨습니다.
db부터 하나하나 따라했는데
로그인하면 DB 테이블에 값이 안들어가요~
ㄳㄳ
좋은 정보 감사합니다
깔끔합니다.
그냥 복사만으로 ㅋㅋㅋ
강추합니다.
그냥 복사만으로 ㅋㅋㅋ
강추합니다.
dd
좋은 정보 감사드립니다
꾸벅 ^^
꾸벅 ^^