代码安全维护指南
基于证据的安全性和代码访问安全性为实现安全性提供了非常强大的显式机制。 大多数应用程序代码可以只使用由 .NET Framework 实现的基础结构。 但在某些情况下,需要采用其他一些通过扩展安全系统或者通过使用新的特殊方法建立的、应用程序特定的安全机制。
使用 .NET Framework 所实施的权限以及代码中的其他实施手段,您可以建立屏障,以防止恶意代码获取您不希望其获取的信息或执行其他不该执行的操作。 此外,在使用受信任代码的所有预期方案中,必须在代码的安全性和可用性之间达成一种平衡。
本概述通过几种不同的方法,说明如何设计在安全系统上运行的代码。
注意 |
---|
在 .NET Framework 4 版中,对 .NET Framework 安全模型和术语进行了重要更改。有关这些更改的更多信息,请参见 .NET Framework 4 中的安全性更改。 |
不受安全性影响的代码
不受安全性影响的代码与安全系统没有显式关系。 它使用所收到的任何权限运行。 虽然未能捕捉到与受保护操作(例如使用文件、联网等)相关的安全异常的应用程序会引发未经处理的异常,但不受安全性影响的代码还是利用了 .NET Framework 安全技术。
不受安全性影响的库具有一些特征,您应当了解这些特征。 假定您的库提供了使用文件的或调用非托管代码的 API 元素,如果代码没有相应的权限,它就不会正常运行。 然而,即使代码具有这种权限,调用它的任何应用程序代码也必须具有同样的权限才能正常运行。 如果调用代码没有适当的权限,就会出现 SecurityException,这是代码访问安全性堆栈审核的结果。
不是可重用组件的应用程序代码
如果代码是一个应用程序的一部分,而该应用程序不会被其他代码调用,那么安全性很简单,可能不需要采取特殊的编码措施。 然而,请记住,恶意代码可以调用您的代码。 虽然代码访问安全性可以阻止恶意代码访问资源,但是,这类代码仍然可以读取字段或属性的值,而这些字段或属性可能包含重要信息。
此外,如果代码接受了来自 Internet 或其他不可靠来源的用户输入,则必须注意防范恶意的输入。
用于本机代码实现的托管包装
通常在这种情形下,本机代码中实现了某些有用的功能,而您希望托管代码可以使用这些本机代码。 使用平台调用或 COM 互操作,可以很方便地编写托管包装。 然而,如果这样做,包装的调用方必须具有非托管代码权限才能获得成功。 在默认策略下,这意味着从 Intranet 或 Internet 下载的代码不能使用这些包装。
与其将非托管代码权限授予所有使用这些包装的应用程序,不如只将这些权限授予包装代码。 如果基础功能没有公开任何资源,而且实现也同样安全,则包装只需要断言其权限,这使得任何代码都可以通过该包装进行调用。 当涉及到资源时,代码安全维护应当与下一节中所介绍的库代码的情况相同。 因为包装可能要公开这些资源的调用方,所以必须对本机代码的安全进行仔细验证,这是包装的责任。
公开受保护资源的库代码
对于代码安全维护,以下是最为有效同时也可能是很危险的方法(如果处理不当的话):库作为其他代码访问特定资源的接口,否则这些资源不可用;就像 .NET Framework 的类为它们所使用的资源实施权限一样。 无论在何处公开资源,代码必须首先要求与资源对应的权限(即,执行安全检查),然后,通常会断言它执行实际操作的权限。
相关主题
标题 |
说明 |
---|---|
说明如何在受限安全环境中运行部分受信任的应用程序,这种环境限制授予应用程序的代码访问权限。 |
|
介绍如何使用安全请求与 .NET Framework 安全系统进行交互。 |
|
描述如何保护私有成员。 |
|
描述如何帮助保护方法不为部分受信任的代码调用。 |
|
描述包装其他代码的代码的安全问题。 |
|
描述使用 .NET Framework 库中所含公共只读数组的代码的安全问题。 |
|
描述处理异常时的安全问题。 |
|
描述接受用户输入的应用程序的安全问题。 |
|
描述在不同应用程序域之间进行通信的应用程序的安全问题。 |
|
描述序列化对象时的安全问题。 |
|
描述如何避免代码中出现争用条件。 |
|
说明生成动态代码的应用程序的安全问题。 |
|
描述可能会允许规避安全机制的权限。 |
|
描述测试和安装应用程序的注意事项。 |
|
详细描述 ASP.NET 安全性,并提供关于在代码中使用此安全性的说明。 |
|
详细描述 .NET Framework 代码访问安全性,并提供有关在代码中使用此安全性的指导。 |
|
详细描述 .NET Framework 基于角色的安全性,并提供关于在代码中使用此安全性的说明。 |