Просмотр файла engine/classes/ip4filter.class.php

Размер файла: 3.2Kb
  1. <?
  2. //На основе приведенных выше примеров я смешанного класса IPFilter
  3. //с netMatch функции Wich дает мне
  4. //полную класс для IP4 проверки в том числе формате CIDR IP:
  5.  
  6. class IP4Filter {
  7.  
  8. private static $_IP_TYPE_SINGLE = 'single';
  9. private static $_IP_TYPE_WILDCARD = 'wildcard';
  10. private static $_IP_TYPE_MASK = 'mask';
  11. private static $_IP_TYPE_CIDR = 'CIDR';
  12. private static $_IP_TYPE_SECTION = 'section';
  13. private $_allowed_ips = array();
  14.  
  15. public function __construct($allowed_ips) {
  16. $this->_allowed_ips = $allowed_ips;
  17. }
  18.  
  19. public function check($ip, $allowed_ips = null) {
  20. $allowed_ips = $allowed_ips ? $allowed_ips : $this->_allowed_ips;
  21.  
  22. foreach ($allowed_ips as $allowed_ip) {
  23. $type = $this->_judge_ip_type($allowed_ip);
  24. $sub_rst = call_user_func(array($this, '_sub_checker_' . $type), $allowed_ip, $ip);
  25.  
  26. if ($sub_rst) {
  27. return true;
  28. }
  29. }
  30.  
  31. return false;
  32. }
  33.  
  34. private function _judge_ip_type($ip) {
  35. if (strpos($ip, '*')) {
  36. return self :: $_IP_TYPE_WILDCARD;
  37. }
  38.  
  39. if (strpos($ip, '/')) {
  40. $tmp = explode('/', $ip);
  41. if (strpos($tmp[1], '.')) {
  42. return self :: $_IP_TYPE_MASK;
  43. } else {
  44. return self :: $_IP_TYPE_CIDR;
  45. }
  46. }
  47.  
  48. if (strpos($ip, '-')) {
  49. return self :: $_IP_TYPE_SECTION;
  50. }
  51.  
  52. if (ip2long($ip)) {
  53. return self :: $_IP_TYPE_SINGLE;
  54. }
  55.  
  56. return false;
  57. }
  58.  
  59. private function _sub_checker_single($allowed_ip, $ip) {
  60. return (ip2long($allowed_ip) == ip2long($ip));
  61. }
  62.  
  63. private function _sub_checker_wildcard($allowed_ip, $ip) {
  64. $allowed_ip_arr = explode('.', $allowed_ip);
  65. $ip_arr = explode('.', $ip);
  66. for ($i = 0; $i < count($allowed_ip_arr); $i++) {
  67. if ($allowed_ip_arr[$i] == '*') {
  68. return true;
  69. } else {
  70. if (false == ($allowed_ip_arr[$i] == $ip_arr[$i])) {
  71. return false;
  72. }
  73. }
  74. }
  75. }
  76.  
  77. private function _sub_checker_mask($allowed_ip, $ip) {
  78. list($allowed_ip_ip, $allowed_ip_mask) = explode('/', $allowed_ip);
  79. $begin = (ip2long($allowed_ip_ip) & ip2long($allowed_ip_mask)) + 1;
  80. $end = (ip2long($allowed_ip_ip) | (~ ip2long($allowed_ip_mask))) + 1;
  81. $ip = ip2long($ip);
  82. return ($ip >= $begin && $ip <= $end);
  83. }
  84.  
  85. private function _sub_checker_section($allowed_ip, $ip) {
  86. list($begin, $end) = explode('-', $allowed_ip);
  87. $begin = ip2long($begin);
  88. $end = ip2long($end);
  89. $ip = ip2long($ip);
  90. return ($ip >= $begin && $ip <= $end);
  91. }
  92.  
  93. private function _sub_checker_CIDR($CIDR, $IP) {
  94. list ($net, $mask) = explode('/', $CIDR);
  95. return ( ip2long($IP) & ~((1 << (32 - $mask)) - 1) ) == ip2long($net);
  96. }
  97.  
  98. }
  99. ?>