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

如何对C#程序集或源码文件进行沙箱隔离以限制系统功能访问

限制自定义代码访问.NET系统危险API的解决方案

针对你遇到的问题——禁用using语句后用户仍可通过完全限定名调用System.IO.File.Delete这类危险系统功能,以下是几个实用的解决办法:

1. 编译阶段用Roslyn分析器拦截

自己写个Roslyn分析器,扫描用户代码里的方法调用,一旦发现System.IO.File.Delete这类被禁止的完全限定名调用,直接在编译时抛出错误,不让代码通过编译。

  • 实现思路:创建DiagnosticAnalyzer,遍历语法树中的调用表达式,检查被调用的符号是否属于你要禁用的类型/方法。比如匹配System.IO.File类型下的所有危险方法(Delete、Create等),触发诊断提示。
  • 好处:从源头堵死非法代码,还能给用户明确的错误提示,告诉他们哪些API不能用。
  • 注意:要把这个分析器集成到你的代码编译流程里,比如作为项目依赖或者自定义编译工具的一部分。

2. 运行时用沙箱环境隔离

别让用户代码直接在主程序的进程域里跑,而是创建受限的运行环境:

  • 在.NET Framework里可以用AppDomain,配置PermissionSet去掉FileIOPermission这类危险权限;.NET Core/5+里推荐用AssemblyLoadContext配合权限策略。
  • 示例代码(简化版):
    var restrictedPermissions = new PermissionSet(PermissionState.None);
    // 只给执行权限,不给文件操作权限
    restrictedPermissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
    // 用这个权限集创建沙箱环境加载用户程序集
    
  • 好处:就算编译时漏了,运行时也会抛出SecurityException拦下来,权限配置灵活,能分等级限制。
  • 注意:.NET Core里AppDomain功能有限,得用AssemblyLoadContext替代,或者参考沙箱化的设计思路。

3. 编译后用IL重写修改程序集

用IL编辑工具加载编译好的用户程序集,把里面调用危险API的代码替换成抛出异常的逻辑,或者直接删掉调用指令。

  • 实现思路:遍历程序集里所有方法的IL代码,找到调用System.IO.File.Delete的指令,替换成调用自定义的错误方法,比如throw new NotAllowedException("此API禁止调用")。
  • 好处:对用户透明,不需要改编译流程,适合没法控制用户编译环节的场景。
  • 注意:得懂点IL指令的知识,还要处理方法重载、泛型等复杂情况,别把程序集改坏了。

4. 编译时限制引用的程序集

编译用户代码的时候,只允许引用你指定的安全程序集,不允许直接引用System.IO这类包含危险API的程序集。你可以自己写个包装类库,只暴露安全的功能给用户用。

  • 实现思路:配置CSharpCompilation的引用集合,只加System.Runtime等基础安全程序集,还有你自己的API库。这样用户写System.IO.File.Delete的时候,编译会提示找不到类型,根本过不了。
  • 好处:从依赖层面彻底切断危险API的访问路径,用户只能用你允许的功能。
  • 注意:得平衡好功能和安全,你的包装类要覆盖用户的正常需求,同时过滤掉所有危险操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:10:31