返回

文章详情

在沙盒中运行Python代码,使用MicroPython和WASM

Hacker News2026年6月6日 14:15

2026年6月6日 我已经实验了多年在沙盒中运行代码的不同方法,但我的最新尝试感觉终于可能具备我一直在寻找的特性。我将其发布为一个名为micropython-wasm的alpha包,并使用它作为Datasette Agent的代码执行沙盒插件,称为datasette-agent-micropython。 我为什么想要一个沙盒?我希望从沙盒中获得WebAssembly在这里看起来非常有前景。MicroPython在WebAssembly中构建第一个版本自己尝试一下。你是否应该信任我基于代码的沙盒?我为什么想要一个沙盒?我的关键开源项目——Datasette、LLM,甚至sqlite-utils——都支持插件。我绝对喜欢插件作为扩展软件的一种机制。一个精心设计的插件系统几乎消除了尝试新事物的风险——即使是最疯狂的想法,也不会对核心应用程序产生持久影响。我的软件可以一夜之间增长一个新特性,我甚至不必审核一个拉取请求!有一个主要缺点:我的插件系统都使用Python和Pluggy,插件代码在我的应用程序中具有完全权限。一个有缺陷或恶意的插件可能会破坏一切或泄露私密数据。我希望能够在一个环境中运行插件风格的代码,在其中无法读取未批准的文件、连接到网络,或以对应用程序或用户计算机其他部分有风险或有害的方式进行操作。我的兴趣不仅限于插件。特别是对于Datasette,有许多我想支持的特性,其中任意代码执行将是有用的。我已经在Datasette Enrichments中尝试过这个,其中代码可以用来转化存储在表中的值。我想建立一个机制,使您可以按计划运行代码,该代码从批准的位置获取JSON,运行一小段代码将其重新格式化为字典列表,然后将这些作为行插入SQLite数据库表中。 我希望从沙盒中获得的功能 我的目标是在我自己的Python应用程序中安全地执行代码。以下是我所需要的:能够从PyPI上干净地安装的依赖项,包括必要时跨多个平台的二进制轮子。我不希望使用我的软件的人需要采取除直接安装我的Python包之外的任何额外步骤。执行的代码必须受内存和CPU限制,我不希望while True: s += "长字符串"使我的应用程序或用户的计算机崩溃。文件访问必须严格控制。要么完全没有文件系统访问,要么我能够明确指定可以读取哪些文件以及可以写入哪些文件。网络访问也受到控制。沙盒代码不应能够在没有经过我完全控制的层的情况下与任何东西进行通信。支持与主机函数的交互。如果我不能仔细地将选定的平台特性暴露给正在运行的代码,沙盒就没什么用。它必须是稳健的、受支持的,并且有清晰的文档。我已经记不清我在没有积极维护的库中看到的沙盒项目的数量了! WebAssembly在这里看起来非常有前景。Web浏览器在对付恶意代码时处于最敌对的环境。它们的工作是在几乎每次页面加载时从网络下载并执行不受信任的代码。鉴于此,JavaScript引擎应是沙盒的优秀候选者。可悲的是,这些引擎也非常复杂,并且没有设计成容易嵌入其他项目。大多数我见过的V8-in-Python项目维护频率不高,并且附有警告,不要将其与完全不受信任的代码一起使用。WebAssembly则是一个更好的候选者。它从一开始就是为了支持我关心的所有特性而设计的,并且在浏览器中经过近十年的测试。 wasmtime Python库将WASM引入Python,得到了积极维护,并具有二进制轮子。 WebAssembly中的MicroPython WebAssembly引擎如wasmtime运行WebAssembly二进制文件。一些编程语言如Rust很容易直接编译为WebAssembly。动态语言如JavaScript和Python则更难——它们支持诸如eval()之类的语言原语,这意味着它们在运行时需要完整的解释器。为了运行Python,我们需要一个完整的Python解释器编译为WebAssembly,并通过一种便于传递代码、挂接主机功能和访问结果的方式连接。Pyodide提供了一个出色的包,用于在浏览器中使用WebAssembly运行Python,但在服务器端的Python中使用Pyodide并不受支持。我找到的最新建议来自2024年10月,指出“Pyodide是由Emscripten工具链构建的,只能在浏览器或Node.js中运行”。前几天,我决定看看MicroPython作为这个选项。MicroPython网站上说:MicroPython是Python 3程序的精简高效实现。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡