/** * Проверка подсети админа */ private function _check_subnet() { if (is_array($this->config->config['admin_ip'])) { /* В конфигурации задан список белых IP * Если IP, с которого происходит авторизация нет в белом списке, * то авторизация неудачна */ if (!in_subnet($this->input->ip_address(), $this->config->config['admin_ip'])) { return false; } } else { $ip_ex = explode(' ', $this->config->config['admin_ip']); /* В конфигурации задан список белых IP * Если IP, с которого происходит авторизация нет в белом списке, * то авторизация неудачна */ if (!in_subnet($this->input->ip_address(), $ip_ex)) { return false; } } return true; }
function in_subnet($ip, $net) { if (is_array($net)) { foreach ($net as $net1) { if ($return = in_subnet($ip, $net1)) { return $return; } } return false; } if (strpos($net, "/") > -1) { list($net_ip, $net_mask) = explode("/", $net, 2); $subnet_octets = array_map("intval", explode(".", $net_ip, 4)); if (preg_match("/^\\d+\$/", $net_mask)) { $mask_octets = str_repeat("1", (int) $net_mask); $mask_octets = str_pad($mask_octets, 32, '0'); $mask_octets = substr(chunk_split($mask_octets, 8, "."), 0, -1); $mask_octets = explode(".", $mask_octets, 4); $mask_octets = array_map("bindec", $mask_octets); } else { $mask_octets = array_map("intval", explode(".", $net_mask)); if (count($mask_octets) !== 4) { return false; } } } else { $subnet_octets = explode(".", $net); if (count($subnet_octets) !== 4) { return false; } $subnet_octets = array_map("intval", $subnet_octets); $mask_octets = array(); foreach ($subnet_octets as $o) { $mask_octets[] = $o ? 255 : 0; } } $subnet_masked = array(); foreach ($subnet_octets as $k => $cur) { $subnet_masked[] = $cur & $mask_octets[$k]; } $ip_octets = array_map("intval", explode(".", $ip, 4)); if (count($ip_octets) !== 4) { return false; } $ip_masked = array(); foreach ($ip_octets as $k => $cur) { $ip_masked[] = $cur & $mask_octets[$k]; } return $subnet_masked === $ip_masked; }