*/ /** *xpressengine 소스 참고 */ class Ipfilter { public function filter($ip_list = '', $ip = null) { if (empty($ip)) { $ip = $_SERVER['REMOTE_ADDR']; } $long_ip = ip2long($ip); if ($ip_list) { foreach ($ip_list as $filter_ip) { $range = explode('-', $filter_ip); if ( ! isset($range[1]) OR empty($range[1])) { // single address type $star_pos = strpos($filter_ip, '*'); if ($star_pos !== false) { // wild card exist if (strncmp($filter_ip, $ip, $star_pos) === 0) { return true; } } elseif (strcmp($filter_ip, $ip) === 0) { return true; } } elseif (ip2long($range[0]) <= $long_ip && ip2long($range[1]) >= $long_ip) { return true; } } } return false; } public function validate($ip_list = array()) { /* 사용가능한 표현 * 192.168.2.10 - 4자리의 정확한 ip주소 * 192.168.*.* - 와일드카드(*)가 사용된 4자리의 ip주소, a클래스에는 와일드카드 사용불가, * 와일드카드 이후의 아이피주소 허용(단, filter()를 쓸 경우 와일드카드 이후 주소는 무시됨 * 192.168.1.1-192.168.1.10 - '-'로 구분된 정확한 4자리의 ip주소 2개 */ $regex = "/^ (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) (?: (?: (?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3} (?:-(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){1} (?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3} ) | (?: (?:\.(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|\*)){3} ) ) $/"; $regex = str_replace(array("\r\n", "\n", "\r", "\t", " "), '', $regex); foreach ($ip_list as $i => $ip) { preg_match($regex, $ip, $matches); if ( ! count($matches)) { return false; } } return true; } }