debug_logger->log_debug("AIOWPSecurity_Utility_IP - Invalid IP received ".$ip, 4); } return $ip_range; } public static function create_ip_list_array_from_string_with_newline($ip_addresses) { $ip_list_array = preg_split("/\R/", $ip_addresses); return $ip_list_array; } /** * Returns IPv6 ip address or IPv6 range if valid * * @param string $item possible IPv6 ip address or IPv6 range * @return string|boolean $checked_ip trimmed IPv6 ip address or IPv6 range if given input is valid otherwise false. */ public static function is_ipv6_address_or_ipv6_range($item) { $checked_ip = false; $res = WP_Http::is_ip_address($item); if ('6' == $res && class_exists('WpOrg\Requests\Ipv6') && WpOrg\Requests\Ipv6::check_ipv6($item)) { $checked_ip = trim($item); } elseif ('6' == $res && class_exists('Requests_IPv6') && Requests_IPv6::check_ipv6($item)) { $checked_ip = trim($item); } else { //ipv6 - range check for valid CIDR range $item_ip_range = explode('/', $item); $ip_part_valid = filter_var($item_ip_range[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); //1 - 164 range of the IPv6 subnect masking as per CISCO propersed change from 128. if (2 == count($item_ip_range) && $ip_part_valid && $item_ip_range[1] >= 1 && $item_ip_range[1] <= 164) { $checked_ip = trim($item); } } return $checked_ip; } /** * Validates IP or IP range * * @param array $ip_list_array * @param string $list_type * @return array $return_payload */ public static function validate_ip_list($ip_list_array, $list_type = '') { $errors = ''; $current_user_ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); //validate list $submitted_ips = $ip_list_array; $list = array(); if (!(include_once AIO_WP_SECURITY_PATH.'/vendor/mlocati/ip-lib/ip-lib.php')) { throw new \Exception("AIOWPSecurity_Utility_IP::validate_ip_list failed to load ip-lib.php"); } if (!empty($submitted_ips)) { foreach ($submitted_ips as $item) { $item = sanitize_text_field($item); if (strlen($item) > 0) { $ip_address = \IPLib\Factory::addressFromString($item); $ip_address_range = \IPLib\Factory::rangeFromString($item); if (null == $ip_address && null == $ip_address_range) { $errors .= "\n".$item.__(' is not a valid ip address format.', 'all-in-one-wp-security-and-firewall'); } if (strlen($item) > 4 && !in_array($item, $list)) { if ($item == $current_user_ip && 'blacklist' == $list_type) { //You can't ban your own IP $errors .= "\n".__('You cannot ban your own IP address: ', 'all-in-one-wp-security-and-firewall').$item; } else { $list[] = trim($item); } } } } } else { //This function was called with an empty IP address array list } if (strlen($errors)> 0) { $return_payload = array(-1, array($errors)); return $return_payload; } if (sizeof($list) >= 1) { sort($list); $list = array_unique($list, SORT_STRING); $return_payload = array(1, $list); return $return_payload; } $return_payload = array(1, array()); return $return_payload; } /** * If login whitelist enabled and the user IP is not whitelisted, Then forbid access. * * @return void */ public static function check_login_whitelist_and_forbid() { if (defined('AIOS_DISABLE_LOGIN_WHITELIST') && AIOS_DISABLE_LOGIN_WHITELIST) { return; } global $aio_wp_security; if ('1' != $aio_wp_security->configs->get_value('aiowps_enable_whitelisting')) { return; } $whitelisted_ips = $aio_wp_security->configs->get_value('aiowps_allowed_ip_addresses'); $is_whitelisted = AIOWPSecurity_Utility_IP::is_userip_whitelisted($whitelisted_ips); if ($is_whitelisted) { return; } header('HTTP/1.1 403 Forbidden'); exit(); } /** * Checks if user IP address matches against the specified whitelist of IP addresses or IP ranges * * @param type $whitelisted_ips (newline separated string of IPs) * @return boolean */ public static function is_userip_whitelisted($whitelisted_ips) { if (empty($whitelisted_ips)) return false; $ip_list_array = AIOWPSecurity_Utility_IP::create_ip_list_array_from_string_with_newline($whitelisted_ips); if (empty($ip_list_array)) return false; return AIOS_Helper::is_user_ip_address_within_list($ip_list_array); } }