You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python脚本中实现容器?Kivy应用执行不可信代码需求

在跨平台Kivy应用中实现不可信代码隔离的纯Python方案

完全可以通过纯Python工具链实现不可信代码的隔离执行,以下是几个跨平台可行的方案,均无需依赖Docker/Podman这类独立容器工具:

1. 基于subprocess的独立Python子进程隔离

通过启动受限的独立Python子进程来隔离不可信代码,核心是限制子进程的资源访问和可用模块:

  • 启动子进程时使用python -S参数禁用site模块,避免自动导入系统全局的第三方库
  • 手动构造sys.path,仅包含安全的标准库模块
  • 配合平台原生的权限限制:
    • Linux:通过prlimit限制进程资源,或使用seccomp过滤危险系统调用
    • Windows:调用WinAPI限制进程的文件系统访问权限
    • macOS:使用sandbox-exec配置沙箱规则

示例代码(主进程侧):

import subprocess
import sys

def run_untrusted_code(code: str):
    # 启动受限Python子进程,仅允许访问指定标准库
    proc = subprocess.run(
        [sys.executable, "-S", "-c", code],
        capture_output=True,
        text=True,
        # 可选:添加平台特定的权限限制参数
    )
    return proc.stdout, proc.stderr

注意:需要严格过滤子进程的环境变量,避免泄露敏感信息;同时禁止子进程访问网络、文件系统等敏感资源。

2. 使用RestrictedPython实现代码级隔离

RestrictedPython是Python官方生态的库,它通过语法分析和环境限制,将不可信代码限制在安全的子集内运行,无需启动独立进程:

  • 限制不可信代码的内置函数(如禁止open()、os.system())
  • 控制全局变量的访问,禁止修改系统级对象
  • 支持在当前进程内的隔离命名空间中执行代码

示例代码:

from RestrictedPython import compile_restricted, safe_globals
from RestrictedPython.Eval import default_guarded_getitem

# 定义允许的全局变量和内置函数
safe_globals.update({
    '__builtins__': {
        'print': print,
        'int': int,
        'str': str,
        # 仅添加明确允许的内置对象
    },
    '_getitem_': default_guarded_getitem,  # 允许列表/字典的索引访问
})

def execute_restricted(code: str):
    try:
        # 编译受限代码
        byte_code = compile_restricted(code, '<untrusted>', 'exec')
        # 在安全命名空间中执行
        local_namespace = {}
        exec(byte_code, safe_globals, local_namespace)
        return local_namespace.get('result')
    except Exception as e:
        return f"Execution error: {str(e)}"

限制:需要仔细配置允许的操作,避免被绕过;部分复杂的Python语法可能不被支持,性能略低于原生Python。

3. PyPy沙箱(跨平台支持)

PyPy解释器内置了轻量级沙箱机制,可跨Windows/macOS/Linux使用,能限制代码的系统调用、文件访问和内存使用:

  • 以沙箱模式启动PyPy子进程,不可信代码无法直接访问宿主系统资源
  • 通过管道实现主进程与沙箱进程的输入输出通信
  • 可配置沙箱的资源配额(如内存上限、CPU时间)

示例代码(主进程侧):

import subprocess

def run_in_pypy_sandbox(code: str):
    # 假设PyPy已打包在应用目录中
    proc = subprocess.run(
        ['pypy3', '--sandbox', '-c', code],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True
    )
    return proc.stdout, proc.stderr

注意:需要将PyPy解释器打包进Kivy应用,会增加应用体积;沙箱规则需提前配置,避免过度授权。

方案选择建议

  • 若追求最高安全性:优先选择subprocess+平台原生权限限制,完全隔离进程环境
  • 若追求低开销和集成性:选择RestrictedPython,无需额外进程开销
  • 若跨平台需求严格且资源充足:选择PyPy沙箱

内容的提问来源于stack exchange,提问作者Jack Hanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:05:35