You need to enable JavaScript to run this app. C#基于IronPython运行Python脚本时如何禁用系统库默认访问权限
优惠活动
大模型
产品
解决方案
定价
更多

C#基于IronPython运行Python脚本时如何禁用系统库默认访问权限

关闭IronPython默认System模块访问的配置方法

IronPython默认会自动将当前AppDomain加载的.NET公共程序集(含System.dll)的类型注入脚本全局作用域,同时开放clr模块供脚本动态加载任意程序集,可通过以下配置完全关闭该默认权限:

  • 初始化引擎时禁用默认程序集自动导入
    // 自定义引擎初始化参数,关闭自动加载逻辑
    var engineOptions = new Dictionary<string, object>
    {
        ["NoDefaultAssemblies"] = true, // 禁止自动导入System等默认.NET命名空间
        ["NoImportOfAssemblies"] = true // 禁止自动导入当前AppDomain已加载的所有程序集
    };
    var engine = Python.CreateEngine(engineOptions);
    
  • 手动清理脚本作用域的默认注入内容
    创建独立脚本作用域后,仅保留你指定开放的自定义业务模块,移除所有默认注入的.NET类型、内置危险模块:
    var scope = engine.CreateScope();
    var defaultVariables = scope.GetVariableNames().ToList();
    // 仅保留白名单内的变量/模块
    var allowedVariables = new HashSet<string> { "MyCustomModAPI", "print", "math" };
    foreach (var varName in defaultVariables)
    {
        if (!allowedVariables.Contains(varName))
        {
            scope.RemoveVariable(varName);
        }
    }
    // 必须主动移除clr模块,禁止脚本动态加载任意.NET程序集
    scope.RemoveVariable("clr");
    
  • 重写内置导入函数__import__实现白名单校验
    防止脚本通过动态导入绕过限制,仅允许导入指定的安全模块:
    var builtinImport = engine.GetBuiltinModule("__import__");
    // 自定义导入逻辑
    Func<CodeContext, string, object, object, object[], object> customImport = (ctx, moduleName, globals, locals, fromList) =>
    {
        var allowedModules = new HashSet<string> { "MyCustomModAPI", "math", "json" };
        if (!allowedModules.Contains(moduleName))
        {
            throw new Exception($"未授权导入模块: {moduleName}");
        }
        return builtinImport.Invoke(ctx, moduleName, globals, locals, fromList);
    };
    // 注入自定义导入函数到作用域
    scope.SetVariable("__import__", customImport);
    
  • 可选:启用*代码访问安全(CAS)*限制
    .NET Framework环境下可创建部分信任的AppDomain,给IronPython引擎分配最小权限集,禁止访问文件系统、注册表、反射等敏感系统能力;.NET Core/.NET 5+环境下可使用AssemblyLoadContext隔离程序集加载范围,避免未授权程序集被加载。
适配权限隔离需求的替代实现方案

如果上述配置仍无法满足严格的隔离要求,可选择以下适配模组场景的实现方案:

  • 升级到IronPython 3
    IronPython 3对.NET程序集导入的控制粒度更细,支持直接通过ScriptHost配置完全禁用默认的.NET类型注入,同时修复了IronPython 2中多个权限绕过的漏洞,适合需要继续保留.NET互操作能力的场景。
  • 嵌入式CPython + 自定义桥接层
    放弃IronPython的.NET原生互操作,改用嵌入式CPython(通过Pythonnet或原生C API嵌入),仅通过自研的C扩展层将指定的业务模块暴露给Python解释器,原生不开放任何系统级API,同时可结合操作系统级沙箱(如Windows Job Object、Linux seccomp)限制进程的系统调用权限。
  • WebAssembly(WASM)沙箱运行时
    若业务场景支持WebView或WASM运行环境,可使用Pyodide(CPython编译的WASM版本),利用WASM天生的沙箱隔离机制,天然禁止脚本访问宿主系统能力,仅通过自定义桥接层开放业务API,无需手动处理底层权限控制。
  • 纯Python沙箱解释器
    如果不需要兼容第三方Python库,可使用纯Python实现的沙箱解释器(如Skulpt、PyPy沙箱模式),解释器完全运行在托管环境中,没有任何底层系统访问能力,仅通过自定义API注入实现模组功能,隔离性最强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 23:36:04