不能通过 Data URI 直接 import 临时代码块实现安全沙箱,因浏览器规范禁止 data: URI 作为 ES 模块来源,且 eval/Function 等动态执行仍共享全局环境、无法隔离 API 和副作用。

不能通过 Data URI 直接 import 临时代码块来实现安全、可靠的运行时沙箱。这不是一个可行或推荐的方案,原因在于浏览器的安全机制与模块系统的设计限制。
Data URI 不被支持为 ES 模块来源
现代浏览器(Chrome、Firefox、Safari)明确禁止将 data: URI 作为 import() 或静态 import 的目标。尝试如下操作会直接报错:
import('./data:text/javascript;base64,export%20default%2042').then(console.log)
错误信息类似:Failed to resolve module specifier "data:..."。这是规范层面的限制,不是兼容性问题,无法绕过。
动态执行 ≠ 安全沙箱
即使退而求其次,用 eval()、Function() 或 URL.createObjectURL(new Blob([...])) 执行字符串代码,也完全不构成沙箱:
- 执行环境仍处于当前全局作用域,可自由访问
window、document、localStorage等全部 API - 无法限制网络请求、计时器、DOM 操作或任意副作用
- 无法拦截
import、require或fetch等关键行为
真正可行的轻量级沙箱方向
若目标是“极简运行时沙箱”,应放弃 Data URI + import 的幻想,转向以下实际路径:
-
Web Worker + 有限暴露 API:在 Worker 中执行代码,主页面仅通过
postMessage传递受限输入/输出,不共享任何全局对象 -
iframe sandbox 属性:使用
<iframe sandbox="allow-scripts" srcdoc="<script>...</script>">,配合srcdoc内联脚本,利用 iframe 天然隔离能力 -
Proxy + 虚拟全局对象:用
vm.Context(Node.js)或前端类库如 JS-Interpreter、wasm-sandbox(WASM 实现)模拟受限执行环境
一句话结论
Data URI 是资源内联编码方式,不是模块加载协议;浏览器禁止其参与模块解析,且任何纯 JS 动态执行都无法提供真正的隔离——沙箱必须依赖运行时边界(Worker、iframe、WASM、服务端容器),而非字符串拼接技巧。

















