윈도우, 리눅스에서 사용가능한 맥주소 추출 및 검증하는 소스입니다. 상수 USERLOG_DIRNAME 는 맥주소가 저장되는 폴더이름을 작성하는데, 윈도우나 리눅스에서 shell_exec 를 사용할 수 없을 때 서버에 맥주소를 저장하기 위한 폴더입니다.


이 소스가 위치하는 곳에 logs 폴더를 만들고, 퍼미션 권한을 707 또는 747, 777 중 하나로 변경해서 사용하면 됩니다. 만약 다른 폴더에 저장하고자 한다면 상대경로나 절대경로를 허용하므로 ../logs 또는 /home/www/logs 로 하면 됩니다. 파일에 저장되는 정보는 "ip주소 맥주소" 입니다.


맥주소를 저장하기 위해서는 다음과 같이 세션에 저장합니다.


 $mac = new macAddress(time);
 $_SESSION['macaddr'] = $mac->put_Macaddr();

맥주소로 검증을 하기 위해서는 다음의 코드를 사용합니다.


 $mac = new macAddress(time);

 if(!$mac->get_Macaddr($_SESSION['macaddr']))
 {
    exit('검증된 사용자가 아닙니다.');
 }


time 의 기본값은 30 이며 맥주소 유지시간 분으로 적용합니다.


<?php   
/* 맥 주소 저장 경로 */   
if(!defined("USERLOG_DIRNAME")) {   
  
define("USERLOG_DIRNAME""logs");   
}   
/* Uniqid Key */   
if(!defined("USERLOG_UNIQID_KEY")) {   
  
define("USERLOG_UNIQID_KEY""SHIFTKEY");   
}   

/*   
* Mac Address Class   
*   
* define("USERLOG_DIRNAME", 로그파일 저장경로);   
* $mac = new macAddress(time);   
* time => 맥주소 유지시간, 30 => 30분   
* Mac Address 검증   
* $mac->get_Macaddr(macAddress);   
* Mac Address 저장   
* $mac->put_Macaddr();   
*   
* ex) Mac Address 저장   
* $_SESSION['macaddr'] = $mac->put_Macaddr();   
*   
* ex) Mac Address 검증   
* if(!$mac->get_Macaddr($_SESSION['macaddr'])){   
*   exit('검증된 사용자가 아닙니다.');   
* }   
*   
*/   
class macAddress{   
  var 
$ip;   
  var 
$macAddr;   
  var 
$floating;   
  var 
$dirname;   
  var 
$current;   
  var 
$timer;   

  function 
macAddress($valid_time=30){   
    if(!
is_numeric($valid_time) || ($valid_time 30)){   
      
$valid_time 30;   
    }   
    
$this->timer $valid_time 60;   
    
$this->current time();   


    
$this->dirname USERLOG_DIRNAME '/clientAddress.txt';   
    
$this->macAddr md5(USERLOG_UNIQID_KEY $this->realityMac());   
  }   

  function 
get_Macaddr($usemac){   
    if(!
is_set($usemac)){   
      return 
false;   
    }   

    if(
$this->floating){   
      if(
$this->macAddr === $usemac){   
        return 
true;   
      }   
      return 
false;   
    }else{   
      if(
$this->Mac_LogFile($usemac)){   
        return 
true;   
      }   
      return 
false;   
    }   
  }   

  function 
put_Macaddr(){   
    if(!
$this->floating){   
      
$data false;   
      
$fput $this->current $this->timer ' ' $this->ip ' ' $this->macAddr "\n";   
      if(
$this->is_file($this->dirname)){   
        
$data file_get_contents($this->dirname);   
      }   
      
file_put_contents($this->dirname$data $fput);   

      return 
$this->macAddr;   
    }   
    return 
false;   
  }   

  function 
checkMac($interface, &$matches){   
    if(!
is_set($interface)){   
      return 
false;   
    }   

    if(
preg_match("/(([a-f0-9]{2}[-|:]?){6})/i"$interface$matches)){   
      return 
true;   
    }   
    return 
false;   
  }   

  function 
realityMac(){   
    
$this->ip preg_replace("/[^0-9a-f.:]/i"""$this->getreal_ipaddr());   
    if(!
$this->ip){   
      
$this->ip '127.0.0.1';   
    }   

    if(
substr(PHP_OS01) == 'W'){   
      
$interface 'arp -a';   
    }else{   
      
$interface 'arp -a | grep ' $this->ip;   
    }   

    if(
$this->checkMac(shell_exec($interface), $matches)){   
      
$this->floating true;   
      return 
str_replace(":""-"$matches[0]);   
    }   

    
$this->floating false;   
    return 
$this->imagineMac();   
  }   

  function 
imagineMac(){   
    
$i 0;   
    
$macAddr = array();   
    
$imagine = array("0""1""2""3""4""5""6""7""8",
                     
"9""A""B""C""D""E""F");   

    while(
$i 6){   
      
$i++;   

      
shuffle($imagine);   
      
$macAddr[] = $imagine[0] . $imagine[1];   
    }   
    return 
implode(""$macAddr);   
  }   

  function 
Mac_LogFile($usemac){   
    if(!
$this->checkMac($usemac$matches)){   
      
$usemac $this->imagineMac();   
    }   

    if(
$this->is_file($this->dirname)){   
      
$raw = array();   
      
$certificationMac false;   
      foreach(
explode("\n"file_get_contents($this->dirname)) as $nlist){   
        if(!empty(
$nlist)){   
          list(
$get_date$get_Address) = explode(" "$nlist2);   
          if(
$get_date $this->current){   
            if(
$get_Address == $this->ip ' ' $usemac){   
              
$certificationMac true;   
              
$raw[] = $this->current $this->timer ' ' $get_Address "\n";   
            }else{   
              
$raw[] = $get_date ' ' $get_Address "\n";   
            }   
          }   
        }   
      }   
      if(!empty(
$raw)){   
        
file_put_contents($this->dirnameimplode(""$raw));   
      }   
    }   
    return 
$certificationMac;   
  } 

  function 
getreal_ipaddr() 
  { 
    if(isset(
$_SERVER['HTTP_CLIENT_IP']) && getenv('HTTP_CLIENT_IP')) 
    { 
        return 
$_SERVER['HTTP_CLIENT_IP']; 
    } 
    elseif(isset(
$_SERVER['HTTP_X_FORWARDED_FOR']) &&

                   getenv('HTTP_X_FORWARDED_FOR')) 
    { 
        return 
$_SERVER['HTTP_X_FORWARDED_FOR']; 
    } 
    elseif(isset(
$_SERVER['REMOTE_HOST']) && getenv('REMOTE_HOST')) 
    { 
        return 
$_SERVER['REMOTE_HOST']; 
    } 
    elseif(isset(
$_SERVER['REMOTE_ADDR']) && getenv('REMOTE_ADDR')) 
    { 
        return 
$_SERVER['REMOTE_ADDR']; 
    } 
    return 
false
  } 

  function 
is_file($filename){   
    
$fp is_file($filename);   
    
clearstatcache();   

    if(
$fp){   
      return 
true;   
    }   
    return 
false;   
  }   
}   
?>