大多数应用程序代码只需使用 .NET 实现的基础结构。 在某些情况下,需要额外的应用程序特定安全性,可以通过扩展安全系统或采用新的临时方法来实现。
在代码中使用 .NET 强制权限和其他执行,应建立障碍,以防止恶意代码访问不希望其拥有的信息或执行其他不良行为。 此外,必须使用受信任的代码在所有预期方案中实现安全性和可用性之间的平衡。
本概述介绍了设计代码以使用安全系统的不同方式。
确保资源访问安全
在设计和编写代码时,需要保护和限制代码对资源的访问权限,尤其是在使用或调用未知来源的代码时。 因此,请记住以下技术以确保代码安全:
请勿使用代码访问安全性(CAS)。
请勿使用部分受信任的代码。
请勿使用 AllowPartiallyTrustedCaller 属性(APTCA)。
请勿使用 .NET 远程处理。
请勿使用分布式组件对象模型(DCOM)。
请勿使用二进制格式化程序。
未来不支持将代码访问安全性和安全透明代码用作部分信任代码的安全边界。 我们建议不要加载和执行未知来源的代码,而无需采取替代安全措施。 替代安全措施包括:
虚拟化
AppContainers
操作系统(OS)用户和权限
Hyper-V 容器
中性安全代码
非特定于安全性的代码不对任何安全系统进行显示处理。 它通过所接收的任何权限来运行。 尽管无法捕获与受保护作(如使用文件、网络等)关联的安全异常的应用程序可能会导致未经处理的异常,但与安全无关的代码仍利用 .NET 中的安全技术。
一个安全中立的库具有你应该了解的特殊特征。 假设你的库提供使用文件或调用非托管代码的 API 元素。 如果代码没有相应的权限,则不会按所述运行。 但是,即使代码具有权限,调用它的任何应用程序代码都必须具有相同的权限才能工作。 如果调用代码没有正确的权限,则 SecurityException 将作为代码访问安全堆栈审核的结果显示。
不是可重用组件的应用程序代码
如果代码是其他代码不会调用的应用程序的一部分,安全性很简单,并且可能不需要特殊编码。 但是,请记住,恶意代码可以调用你的代码。 虽然代码访问安全性可能会阻止恶意代码访问资源,但此类代码仍可以读取可能包含敏感信息的字段或属性的值。
此外,如果代码接受来自 Internet 或其他不可靠的源的用户输入,则必须注意恶意输入。
本机代码实现的托管包装
在这种情况下,通常会在本机代码中实现一些有用的功能,以便提供给托管代码使用。 托管包装器可通过使用平台调用或 COM 互操作轻松写入。 但如果你这样做,包装器的调用方必须具有非托管代码权限才能成功。 在默认策略下,这意味着从 Intranet 或 Internet 下载的代码不适用于包装器。
相较于为所有使用这些包装器的应用程序提供非托管代码权限而言,仅对包装器代码提供这些权限是更好的做法。 如果基础功能不公开任何资源,并且实现同样安全,包装器只需断言其权限,这样就可以通过它调用任何代码。 涉及资源时,安全编码应与下一部分所述的库代码用例相同。 因为包装器可能对这些资源公开调用方,所以仔细验证本机代码的安全性是必要的,这是包装器的责任。
公开受保护资源的库代码
以下方法是最强大且可能危险的(如果操作不当)安全编码方法:您的库充当其他代码访问某些其他方式无法获取的资源的接口,就像 .NET 类对其使用的资源权限进行强制一样。 在任何地方公开资源时,代码必须首先要求适合于资源的权限(即,执行安全检查),然后通常断言其执行实际操作的权利。