main_class = $main_class; } public function check_request_rate() { if (empty($this->main_class->options['rate_limiting_enable'])) { return; } if (defined('WP_CLI') && WP_CLI) { return; } $ip = $this->main_class->get_client_ip(); if ($this->main_class->is_whitelisted($ip)) { return; } if (current_user_can('manage_options')) { return; } $all_block_types = ['geoblock', 'honeypot', '404', '403', 'login', 'user_agent', 'waf', 'rate_limit']; foreach ($all_block_types as $type) { if (get_transient('advaipbl_bloqueo_' . $type . '_' . md5($ip))) { return; } } $options = $this->main_class->options; $limit = absint($options['rate_limiting_limit'] ?? 120); $window = absint($options['rate_limiting_window'] ?? 60); if ($limit <= 0 || $window <= 0) { return; } $transient_key = 'advaipbl_rl_count_' . md5($ip); $request_count = (int) get_transient($transient_key); $request_count++; if ($request_count > $limit) { $reason = sprintf(__('Rate limit exceeded: %1$d requests in %2$d seconds', 'advanced-ip-blocker'), $request_count, $window); $log_data = [ 'limit' => $limit, 'window' => $window, 'count' => $request_count, 'uri' => $_SERVER['REQUEST_URI'] ?? 'N/A', ]; delete_transient($transient_key); $this->main_class->log_specific_error('rate_limit', $ip, $log_data); $this->main_class->block_ip_instantly($ip, 'rate_limit', $reason, $log_data); } else { set_transient($transient_key, $request_count, $window); } } }