init
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
class ZenithIP
|
||||
{
|
||||
private $db;
|
||||
public function __construct()
|
||||
{
|
||||
$this->db = new ZenithDB();
|
||||
}
|
||||
public function chk_ip($remote_addr, $list=[])
|
||||
{
|
||||
$is_ip_chk = false;
|
||||
foreach($list as &$ip) {
|
||||
$ip = trim($ip);
|
||||
|
||||
if(strpos($ip, "/") !== false) {
|
||||
if($this->_ip_match($ip, $remote_addr) == true) {
|
||||
$is_ip_chk = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(in_array($remote_addr, $list) === false && $is_ip_chk === false) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function _ip_match($network, $remote_addr)
|
||||
{
|
||||
$ip_arr = explode("/", $network);
|
||||
|
||||
$network_long = ip2long($ip_arr[0]);
|
||||
|
||||
$mask_long = pow(2,32)-pow(2,(32-$ip_arr[1]));
|
||||
$ip_long = ip2long($remote_addr);
|
||||
if(($ip_long & $mask_long) == $network_long) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function ipBlocker($remote_addr, $is_our)
|
||||
{
|
||||
/*
|
||||
$mobile_ip = [
|
||||
'203.226.0.0/16' // SKT 3G
|
||||
,'211.234.0.0/16' // SKT 3G
|
||||
,'223.32.0.0/11' // SKT 4G, 5G
|
||||
//,'2001:2d8::/32' // SKT 4G, 5G IPv6
|
||||
,'39.7.0.0/24' // KT 3G, 4G, 5G
|
||||
,'110.70.0.0/16' // KT 3G, 4G, 5G
|
||||
,'175.223.0.0/16' // KT 3G, 4G
|
||||
,'211.246.0.0/16' // KT 3G
|
||||
,'118.235.0.0/16' // KT 4G, 5G
|
||||
,'211.246.0.0/16' // KT 4G
|
||||
//,'2001:e60::/32' // KT 4G, 5G IPv6
|
||||
,'61.43.0.0/16' // LG 3G
|
||||
,'211.234.0.0/16' // LG 3G
|
||||
,'106.102.0.0/16' // LG 4G
|
||||
,'117.111.0.0/16' // LG 4G
|
||||
,'211.36.0.0/16' // LG 4G
|
||||
,'106.101.0.0/16' // LG 5G
|
||||
//,'2001:4430::/32' // LG 5G IPv6
|
||||
];
|
||||
*/
|
||||
|
||||
$result = $this->db->getIpBlockerByIp($remote_addr);
|
||||
$blocked = $result->db->num_rows;
|
||||
if ($blocked) {
|
||||
$block = $result->db->fetch_assoc();
|
||||
if (strtotime($block['term']) >= time()) {
|
||||
throw new Exception("부정접속으로 확인되어 1시간동안 접속이 차단됩니다.");
|
||||
} elseif ($block['forever'] == 1) {
|
||||
throw new Exception("지속적인 부정접속으로 확인되어 사이트 접속이 차단됩니다.");
|
||||
}
|
||||
}
|
||||
|
||||
//session 으로 분당 접속 카운트
|
||||
if(isset($_SESSION['visit'])){
|
||||
if ($_SESSION['visit']['datetime'] && strtotime($_SESSION['visit']['datetime'] . ' +1 minute') >= time()) {
|
||||
$_SESSION['visit']['count']++;
|
||||
} else {
|
||||
$_SESSION['visit']['datetime'] = date('Y-m-d H:i:s');
|
||||
$_SESSION['visit']['count'] = 1;
|
||||
}
|
||||
//카운트 분당 30회 이상일 경우 블럭처리
|
||||
if ($_SESSION['visit']['count'] >= 30 && !$is_our) {
|
||||
$this->db->setIpBlocker($remote_addr);
|
||||
unset($_SESSION['visit']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//IP정보 가져오기
|
||||
public static function getRemoteAddr()
|
||||
{
|
||||
$ipaddress = '';
|
||||
if (getenv('HTTP_CLIENT_IP'))
|
||||
$ipaddress = getenv('HTTP_CLIENT_IP');
|
||||
else if (getenv('HTTP_X_FORWARDED_FOR'))
|
||||
$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
|
||||
else if (getenv('HTTP_X_FORWARDED'))
|
||||
$ipaddress = getenv('HTTP_X_FORWARDED');
|
||||
else if (getenv('HTTP_FORWARDED_FOR'))
|
||||
$ipaddress = getenv('HTTP_FORWARDED_FOR');
|
||||
else if (getenv('HTTP_FORWARDED'))
|
||||
$ipaddress = getenv('HTTP_FORWARDED');
|
||||
else if (getenv('REMOTE_ADDR'))
|
||||
$ipaddress = getenv('REMOTE_ADDR');
|
||||
else
|
||||
$ipaddress = 'UNKNOWN';
|
||||
|
||||
return $ipaddress;
|
||||
}
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user