保护方法访问
更新:2007 年 11 月
某些方法可能不适合被任意的不受信任代码调用。这类方法会引起多种风险:这样的方法可能提供某些受限制的信息;它可能会信任传递给它的任何信息;它可能不对参数进行错误检查;或由于参数错误,它可能发生故障或产生某种危害。您应当注意这些情况,并采取适当的措施来保护这些方法。
在某些情况下,某些方法尽管不适合用作公共方法,但却必须是公共的,您可能需要对这些方法进行限制。例如,您可能有这样一个接口,您需要在您的所有 DLL 中调用该接口,因而它必须为公共的;但是,您不希望将它公开成公共方法,以免客户使用它或防止恶意代码利用入口点侵入您的组件。对不适合用作公共方法(但又必须是公共的)的方法进行限制的另一种常见原因,是为了避免必须存档和支持地地道道的内部接口。
托管代码提供了下面几种方式来限制方法访问:
如果可以信任类、程序集或派生类,则限制它们的可访问性的范围。这是限制方法访问的最简单方式。请注意,一般来说,虽然在某些情况下派生类共享父类的标识,但是派生类可能比派生它们的类的可信任程度低。特别是,不要从关键字 protected 来推断信任程度,该关键字不一定用于安全性上下文中。
将方法访问限制为具有指定标识的调用方,标识实质上是您所选择的任何特定证据(强名称、发行者、区域等)。
将方法访问限制为拥有您选择的任何权限的调用方。
类似地,声明式安全使您可以控制类的继承。您可以使用 InheritanceDemand 来完成下列任务:
要求派生类具有指定的标识或权限。
要求那些重写特定方法的派生类具有指定的标识或权限。
下面的示例说明如何通过要求调用方使用特定的强名称签名来帮助保护公共类,限制外界对它的访问。此示例使用 StrongNameIdentityPermissionAttribute,该属性包含一个要求提供强名称的 Demand有关如何使用强名称为程序集签名的基于任务的信息,请参见创建和使用具有强名称的程序集。
<StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey := "…hex…", Name := "App1", Version := "0.0.0.0")> _
Public Class Class1
End Class
[StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")]
public class Class1
{
}