[제로보드 자동로그인 보안결함문제 해결방법]

제로보드4의 자동로그인기능은, 로그인시 자동로그인기능을 체크할경우 해당pc에서 로그아웃시키기 전까지는 해당pc에서는 지속적으로 자동로그인이 수행되는 문제가 있는것 같습니다.

만약 밖에나가 다른pc에서 로그인할때 모르고 자동로그인을 활성화시킨체 로그인한후 로그아웃 시키지않고 그냥 인터넷창만 닫고 돌아오면 그 해당pc에서는 누군가가 자신이 로그인했던 사이트에 접속을하면 항상 자신의 id로 로그인된 상태가 됩니다.
집에와서 다시 로그아웃시키거나 심지어는 비밀번호를 바꿔도 밖에서 자동로그인이 설정된 컴에서는 사이트접속시 무조건 자동로그인이 수행됩니다. 이는 보안상 심각한 문제가 아닐수 없습니다.

그래서 이부분을 보완하기위해 인터넷에서 관련정보를 뒤져봤지만 원하는 정보를 찾지못해서 직접 한번 구상해서 로직을 제작해 봤습니다.

원리는 로그인시 해당회원정보DB에 로그인하는 pc의 ip를 저장한후, 추후 자동로그인으로 사이트에 접속시 로그인시 저장된 ip와 현제 접속한 pc의 ip를 비교해서 만약 ip가 서로다를경우 경고메세지를 출력한후 자동로그인기능을 강제 해제시키도록 구성했습니다.

만약 밖에나가 외부pc에서 모르고 자동로그인 기능을 활성화시켜둔체 그대로 돌아왔다 하더라도 집에와서(혹은 다른pc에서) 다시 로그인만 한번 시켜주면 서버DB에 로그인ip가 저장되어 추후 자동로그인이 설정된 외부pc에서 다른 누군가가 사이트를 접속하더라도 서버DB에 저장된 ip와 그 자동로그인되는 pc의 ip정보가 서로 달라져서 경고메세지를 출력한후 강제 로그아웃처리 됩니다.

다시말해 어떤 컴퓨터에서 로그인을 하게되면 그 로그인하는pc외에 다른pc에서는 자동로그인기능이 모두 차단됩니다.


[자동로그인 보안문제 보완방법]


1. 우선 DB의 회원정보테이블에 ip라는 필드를 하나 추가해 줍니다. (참부 이미지 참조)

2. 제로보드폴더의 login_check.php 파일의

 // 회원로그인이 성공하였을 경우 세션을 생성하고 페이지를 이동함
 if($member_data[no]) {

- 부분에 아래처럼 ip를 저장하는 mysql_query문을 추가해 줍니다.

 // 회원로그인이 성공하였을 경우 세션을 생성하고 페이지를 이동함
 if($member_data[no]) {
 //정상적으로 로그인했을경우 현제 로그인한 pc의 ip를 서버DB 회원정보테이블 ip필드에 저장함.
 mysql_query("update zetyx_member_table set ip='$REMOTE_ADDR' where user_id='$user_id'");

3. 제로보드폴더의 lib.php 파일의

 // 자동 로그인일때 제대로 된 자동 로그인인지 체크하는 부분
 unset($autoLoginData);
 $autoLoginData = getZBSessionID();
 if($autoLoginData[no]) {
  $zb_logged_no=$autoLoginData[no];
  $zb_logged_ip=$REMOTE_ADDR;
  $zb_logged_time=time();
  session_register("zb_logged_no");
  session_register("zb_logged_ip");
  session_register("zb_logged_time");
  $HTTP_SESSION_VARS["zb_logged_no"] = $zb_logged_no;
 // 세션 값을 체크하여 로그인을 처리
 } elseif($HTTP_SESSION_VARS["zb_logged_no"]) {

- 부분을(약90번째줄정도에 있슴) 아래와같이 수정해 줍니다.

 // 자동 로그인일때 제대로 된 자동 로그인인지 체크하는 부분
 unset($autoLoginData);
 $autoLoginData = getZBSessionID();
 if($autoLoginData[no]){
  if(!$connect){
   $f=@file($config_dir."config.php") or Error("config.php파일이 없습니다.<br>DB설정을 먼저 하십시요","install.php");
   for($i=1;$i<=4;$i++) $f[$i]=trim(str_replace("\n","",$f[$i]));
   $connect = @mysql_connect($f[1],$f[2],$f[3]) or Error("DB 접속시 에러가 발생했습니다");
   @mysql_select_db($f[4], $connect) or Error("DB Select 에러가 발생했습니다","");
  }
  $member=mysql_fetch_array(mysql_query("select * from zetyx_member_table where no='$autoLoginData[no]'"));
  if($connect){ 
   mysql_close($connect);
   $connect="";
  }
  //유동ip일경우 ip뒷자리가 자주 바뀔수있기때문에 ip 네자릿수 모두 체크하지않고 두자릿수만 체크함.
  //네자리 모두 체크하려면 if($member[ip] != $REMOTE_ADDR) 로 변경하면됨.
  //세자릿수만 체크하려면 아래 양쪽 7을 11로 바꿔주면됨.
  if(substr($member[ip],0,7) != substr($REMOTE_ADDR,0,7)){
   destroyZBSessionID($member[no]);
   // 4.0x 용 세션 처리
   $zb_logged_no='';
   $zb_logged_time='';
   $zb_logged_ip='';
   $zb_secret='';
   $zb_last_connect_check = '0';
   session_register("zb_logged_no");
   session_register("zb_logged_time");
   session_register("zb_logged_ip");
   session_register("zb_secret");
   session_register("zb_last_connect_check");
   session_destroy();
   //로그인ip를 모두 표시할경우 현제pc의 ip정보가 외부에 유출될수 있기때문에 뒤마지막 자릿수는 숨김.
   $iptmp=substr($member[ip],0,12)."xxx";
   //아래 내용에 줄바꿈문자인 \\n 는 \를 두개씩 넣어줄것.
   //경고메세지 없이 강제로그아웃후 원하는 페이지로 이동하려면 아래 print문 주석처리.
   print "<script>alert('다른PC에서 로그인했던 기록이 있습니다.(최종로그인:$iptmp, 현제:$REMOTE_ADDR) \\n\\n보안을 위해 자동로그인 기능을 해제 합니다. 다시 새로 로그인해 주시기 바랍니다. \\n\\n새로 로그인 하게되면 현제pc외에 다른pc에서는 자동로그인 기능이 차단됩니다. \\n\\n(유동ip를쓰는 인터넷일경우 동일 PC에서도 가끔 이 메세지가 표시될수 있습니다.)');</script>";
   //강제로그아웃후 열릴 페이지 설정. 자신의 홈페이지 초기페이지로 설정하면됨.
   movepage('http://vxtour.com');
   exit;
  }
  else{
   $zb_logged_no=$autoLoginData[no];
   $zb_logged_ip=$REMOTE_ADDR;
   $zb_logged_time=time();
   session_register("zb_logged_no");
   session_register("zb_logged_ip");
   session_register("zb_logged_time");
   $HTTP_SESSION_VARS["zb_logged_no"] = $zb_logged_no;
  }
 // 세션 값을 체크하여 로그인을 처리
 } elseif($HTTP_SESSION_VARS["zb_logged_no"]) {

위 코드는 자동로그인에의해 사이트 접속할경우 정상로그인시 저장된 ip와 현제 자동로그인으로 접속하는pc의 ip를 비교하여 서로 다를경우 경고메세지출력후 자동로그인기능을 강제 해제시키는 루틴입니다.
movepage('http://vxtour.com');
부분은 자동로그인기능 강제 해제후 표시될 페이지 주소입니다.
여기에 홈페이지 초기페이지주소를 설정하시면 됩니다.

4. 참고로, 만약 제로보드의 자동로그인기능이 꺼져있다면 login.php파일의 function check_submit()함수의 마지막부분에

function check_submit(){
 .
 .
 .

 check=confirm("자동 로그인 기능을 사용하시겠습니까?\n\n자동 로그인 사용시 다음 접속부터는 로그인을 하실필요가 없습니다.");
 if(check) {login.auto_login.value=1;}
 return true;
}

를 추가해주시면 됩니다.