$_GET, 'POST' => $_POST, 'COOKIE' => $_COOKIE, 'REQUEST_URI' => $request_uri, 'USER_AGENT' => $_SERVER['HTTP_USER_AGENT'] ?? '', ]; foreach ($rules as $rule) { if (empty($rule) || strpos($rule, '#') === 0) { continue; // Ignoramos reglas vacías o comentadas } $pattern = '#' . $rule . '#i'; if ($this->scan_data_recursively($request_data_to_scan, $pattern)) { return $rule; // ¡Amenaza detectada! } } return false; } /** * Escanea recursivamente datos buscando una coincidencia. * @param mixed $data Dato o array a escanear. * @param string $pattern Expresión regular. * @return bool True si hay coincidencia. */ private function scan_data_recursively($data, $pattern) { if (is_array($data)) { foreach ($data as $value) { if ($this->scan_data_recursively($value, $pattern)) { return true; } } } elseif (is_string($data)) { if (@preg_match($pattern, $data)) { return true; } } return false; } }