XpressEngine Core  1.11.2
 All Classes Namespaces Files Functions Variables Pages
IpFilter.class.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) NAVER <http://www.navercorp.com> */
3 
4 class IpFilter
5 {
6  public function filter($ip_list, $ip = NULL)
7  {
8  if(!$ip) $ip = $_SERVER['REMOTE_ADDR'];
9  $long_ip = ip2long($ip);
10  foreach($ip_list as $filter_ip)
11  {
12  $range = explode('-', $filter_ip);
13  if(!$range[1]) // single address type
14  {
15  $star_pos = strpos($filter_ip, '*');
16  if($star_pos !== FALSE ) // wild card exist
17  {
18  if(strncmp($filter_ip, $ip, $star_pos)===0) return true;
19  }
20  else if(strcmp($filter_ip, $ip)===0)
21  {
22  return true;
23  }
24  }
25  else if(ip2long($range[0]) <= $long_ip && ip2long($range[1]) >= $long_ip)
26  {
27  return true;
28  }
29  }
30  return false;
31  }
32 
33  /* public function filter2($ip_list, $ip)
34  {
35  $long_ip = ip2long($ip);
36  foreach($ip_list as $filter_ip)
37  {
38  $range = explode('-', $filter_ip);
39  if(!$range[1]) // single address type
40  {
41  $range[1] = str_replace('*', '255', $range[0]);
42  $range[0] = str_replace('*', '0', $range[0]);
43  }
44 
45  if(ip2long($range[0]) <= $long_ip && ip2long($range[1]) >= $long_ip)
46  {
47  return true;
48  }
49  }
50 
51  return false;
52  } */
53 
54 
55  public function validate($ip_list = array())
56  {
57  /* 사용가능한 표현
58  192.168.2.10 - 4자리의 정확한 ip주소
59  192.168.*.* - 와일드카드(*)가 사용된 4자리의 ip주소, a클래스에는 와일드카드 사용불가,
60  와일드카드 이후의 아이피주소 허용(단, filter()를 쓸 경우 와일드카드 이후 주소는 무시됨
61  192.168.1.1-192.168.1.10 - '-'로 구분된 정확한 4자리의 ip주소 2개
62  */
63  $regex = "/^
64  (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
65  (?:
66  (?:
67  (?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}
68  (?:-(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){1}
69  (?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}
70  )
71  |
72  (?:
73  (?:\.(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|\*)){3}
74  )
75  )
76  $/";
77  $regex = str_replace(array("\r\n", "\n", "\r","\t"," "), '', $regex);
78 
79  foreach($ip_list as $i => $ip)
80  {
81  preg_match($regex, $ip, $matches);
82  if(!count($matches)) return false;
83  }
84 
85  return true;
86  }
87 
88 }
89 
90 
91 /* End of file : IpFilter.class.php */
92 /* Location: ./classes/security/IpFilter.class.php */
validate($ip_list=array())
filter($ip_list, $ip=NULL)