/** * 基于 Proxy 的沙箱实现 * * 这个模块提供了一个安全的代码执行环境,通过 Proxy 劫持全局对象的访问, * 防止恶意代码对宿主环境造成破坏,同时提供受控的 API 访问。 * * 主要特性: * - 全局对象隔离 * - API 访问控制 * - 内存管理 * - 错误捕获和处理 * - 执行超时控制 * * @author md-editor * @version 1.0.0 */ /** * 沙箱配置接口 */ export interface SandboxConfig { /** 允许访问的全局对象白名单 */ allowedGlobals?: string[]; /** 禁止访问的全局对象黑名单 */ forbiddenGlobals?: string[]; /** 是否允许访问 console API */ allowConsole?: boolean; /** 是否允许访问 setTimeout/setInterval */ allowTimers?: boolean; /** 代码执行超时时间(毫秒) */ timeout?: number; /** 是否启用严格模式 */ strictMode?: boolean; /** 自定义的全局变量 */ customGlobals?: Record; /** 是否允许访问 DOM API */ allowDOM?: boolean; /** 最大内存使用限制(字节) */ maxMemoryUsage?: number; } /** * 沙箱执行结果接口 */ export interface SandboxResult { /** 执行结果 */ result: any; /** 是否执行成功 */ success: boolean; /** 错误信息 */ error?: Error; /** 执行时间(毫秒) */ executionTime: number; /** 内存使用情况 */ memoryUsage?: number; } /** * 基于 Proxy 的沙箱类 */ export declare class ProxySandbox { private config; private globalProxy; private sandboxGlobal; private isActive; private timeoutId; private startTime; constructor(config?: SandboxConfig); /** * 创建安全的 document 代理对象 * 允许访问 document 但限制敏感操作 */ private createSafeDocument; /** * 创建安全的 window 代理对象 * 允许访问 window 但限制敏感信息 */ private createSafeWindow; /** * 创建安全的沙箱全局对象 */ private createSandboxGlobal; /** * 创建安全的 console 对象 */ private createSafeConsole; /** * 创建安全的 setTimeout */ private createSafeTimeout; /** * 创建安全的 setInterval */ private createSafeInterval; /** * 创建全局对象的 Proxy */ private createGlobalProxy; /** * 在沙箱中执行代码 */ execute(code: string, injectedParams?: Record): Promise; /** * 检查是否是明显的死循环 */ private isObviousInfiniteLoop; /** * 带超时的普通执行 * 注意:对于同步死循环,setTimeout 无法中断,需要使用 Worker 或指令计数 * 这个方法只适用于不包含死循环的代码 */ private executeWithTimeout; /** * 使用指令计数限制执行时间 * 这是处理同步死循环的唯一方法(在不使用 Worker 的情况下) */ private executeWithInstructionLimit; /** * 在代码中注入指令计数器 * 在循环体内部注入检查点,确保死循环能够被检测到 */ private instrumentCode; /** * 使用 Worker 执行代码以实现真正的超时控制 */ private executeWithWorker; /** * 尝试序列化参数,失败则回退到同步执行 */ private trySerializeParams; /** * 回退到同步执行 */ private fallbackToSyncExecution; /** * 创建 Worker 实例 */ private createWorkerInstance; /** * 生成 Worker 代码 */ private generateWorkerCode; /** * 设置 Worker 超时 */ private setupWorkerTimeout; /** * 设置 Worker 消息处理器 */ private setupWorkerHandlers; /** * 处理控制台消息 */ private handleConsoleMessage; /** * 清理 Worker 资源 */ private cleanupWorker; /** * 执行代码的核心方法(同步版本) */ private executeCode; /** * 验证代码安全性 */ private validateCode; /** * 获取内存使用情况 */ private getMemoryUsage; /** * 清理资源 */ private cleanup; /** * 销毁沙箱 */ destroy(): void; /** * 检查沙箱是否处于活动状态 */ isRunning(): boolean; /** * 添加自定义全局变量 */ addGlobal(name: string, value: any): void; /** * 移除自定义全局变量 */ removeGlobal(name: string): void; /** * 获取沙箱配置 */ getConfig(): Readonly>; } /** * 创建沙箱实例的工厂函数 */ export declare function createSandbox(config?: SandboxConfig): ProxySandbox; /** * 快速执行代码的工具函数 */ export declare function runInSandbox(code: string, config?: SandboxConfig, injectedParams?: Record): Promise;