@
no1xsyzy #8
你说的沙箱最大的问题:“沙箱权限的细粒度控制”可以很复杂,对我反而不重要,因为我只是想简单粗暴地做一个最小可用沙箱的概念验证 /POC,具体来说就是只能使用基本语法,不能使用任何 builtins 内置函数或 import 功能。
长见识了,原来还有 deno 这种沙箱。
至于用 ast 重新写解释器,先不说我没那个水平,原来 ast 还能这么用?我还以为 ast 只能静态修改抽象语法树,不能用来解释运行,而且也无法识别出表达式的最终结果。
不过这启发了我想到另一种实现沙箱的大致思路:针对 builtins 的泄露问题,使用 ast 或者 tokenize 识别第三方脚本中关键的内省属性,比如 __subclasses__、__globals__,然后要么抛错要么替换要么禁用就能解决。缺点是只能针对这种已知的访问 builtins 的方法,对未知的就没有办法预防了。
比如说 exception 附带的堆栈也许有可能会泄露 builtins,就没有办法了。