C#面试题更新 2026-08-05

请阐述 .NET 框架中代码访问安全(CAS)的基本概念,并说明在实际开发中如何运用 CAS 机制来实施安全控制策略?

安全意识技术原理技术选型C#.NET

考察说明

考查对 .NET 代码访问安全(CAS)机制的理解及其在安全控制中的应用能力。

回答思路

  1. 【回答框架 1】代码访问安全(CAS)是 .NET 提供的一种基于证据(evidence)的授权机制,它根据代码的来源、程序集签名等证据,为其分配相应的权限集(permission set)。其核心特征包括:权限(如文件I/O、反射、安全权限等)、权限集、代码组和策略层次(如企业、机器、用户、应用程序域)。CLR 在加载程序集时,依据安全策略评估证据,计算最终授予的权限。
  2. 【回答框架 2】CAS 与传统的基于角色的安全性(RBAC)不同,RBAC 关注用户身份,而 CAS 关注代码本身的可信度,常用于部分信任场景,如从网络加载的插件或 Web 应用中的程序集。在使用上,可以通过配置安全策略或使用声明式(属性)和命令式(代码)的权限请求来限制代码的敏感操作,例如使用 [FileIOPermission(SecurityAction.Demand)] 显式要求调用者具备特定权限。
  3. 【回答框架 3】在实际安全控制中,可利用 CAS 构建沙箱:为不可信代码创建受限的 AppDomain,并设置其权限集,仅授予必要的权限(如执行、隔离存储),阻止其对文件系统、网络、注册表等资源的访问。同时,通过 SecurityAction.Demand 在关键操作前进行权限检查,或通过 PermitOnly、Deny 等动作细化权限边界。需注意 .NET Framework 4.0 之后,CAS 不再作为安全边界,仅作为兼容性保留,策略级 CAS 已过时,推荐使用基于操作系统和托管 API 的安全机制。
  4. 【回答框架 4】当需要决策是否采用 CAS 时,应评估应用场景:若为 .NET Framework 早期版本或需要兼容旧代码,可利用 CAS 提供额外防护;而现代应用应转向更严格的安全编码实践、代码签名、最小权限原则及使用 .NET 的安全 API(如 SafeHandle、加密库),并借助 Windows 安全机制(如 ACL)实现资源保护。
  5. 【关键点 1】CAS 基于代码证据(如源URL、强名称)授予权限,而非用户身份。
  6. 【关键点 2】通过声明式权限请求(如 [FileIOPermission])可在 JIT 编译时进行静态检查。
  7. 【关键点 3】利用参数化权限集和代码组,可为不同来源的代码配置差异化的安全策略。
  8. 【关键点 4】.NET Framework 4.0 起,CAS 仅作兼容性保留,不再作为安全边界。
  9. 【关键点 5】构建沙箱环境时,应使用受限的 AppDomain 并明确设置权限集。
  10. 【易错点 1】误将 CAS 视为万能的沙箱工具,而忽略其漏洞(如权限提升)和性能开销。
  11. 【易错点 2】在 .NET 4.0 之后仍依赖 CAS 策略文件,忽视了已标记为过时的事实。
  12. 【易错点 3】混淆 CAS 与角色安全,未正确区分代码级权限和用户级权限。