声明性安全可提供以下安全检查:
•Demand 指定代码访问安全性的堆栈审核:堆栈上的所有调用方都必须拥有权限或标识才能通过。Demand 会发生在每个调用上,这是因为堆栈可能包含不同的调用方。如果您重复调用某个方法,则每次都会进行该安全检查。Demand 对引诱攻击具有强大的抵御能力;它可捕获试图通过它的未经授权的代码。
•LinkDemand 发生在实时 (JIT) 编译时(在前面的示例中,当引用 Class1 的 App1 代码将要执行时),并且它只检查直接调用方。该安全检查不检查调用方的调用方。一旦通过该检查,无论它被调用多少次,都不会有其他安全开销。但是,它无法防御引诱攻击。如果使用 LinkDemand,则您的接口是安全的,但通过测试并且可以引用您的代码的任何代码都可以潜在地破坏安全性,因为它们允许使用授权代码调用恶意代码。因此,除非可以完全避免所有可能的弱点,否则不要使用 LinkDemand。
使用 LinkDemand 时所需的额外预防措施必须是“手工制订的”(安全系统可以帮助实施)。任何错误都会导致安全漏洞。使用您代码的所有经授权代码都必须通过执行以下操作,来负责实现其他安全性:
•将呼叫代码的访问权限制到类或程序集。
•为该代码设置相同的安全检查,并强制它的调用方这样做。例如,如果您编写的代码调用了某个方法,而该方法通过对 SecurityPermission.UnmanagedCode 权限使用 LinkDemand 获得保护,那么您的方法也应当对该权限使用 LinkDemand(或 Demand,这是更强的手段)。例外情况是,假如代码中有其他安全保护机制(例如,Demand),则您的代码将以一种总是安全的或您决定是安全的受限方式使用 LinkDemand 所保护的方法。在调用方负责削弱对基础代码的安全保护情况下,会出现此例外情况。
•确保它的调用方无法进行欺骗,以代表它去调用受保护的代码(也就是说,调用方不能强迫经授权的代码将特定参数传递给受保护的代码,或从中获得结果)。
接口和 LinkDemands如果具有 LinkDemand 的虚拟方法、属性或事件重写了某个基类方法,则此基类方法也必须具有相同的 LinkDemand,以便重写方法也是安全的。恶意代码可能会强制转换回基础类型,并调用基类方法。还要注意,可以将 LinkDemands 隐式地添加到不具有 AllowPartiallyTrustedCallersAttribute 程序集级属性的程序集中。
好的做法是,当接口方法也有 LinkDemands 时,使用 LinkDemands 对方法实现进行保护。
关于对接口使用 LinkDemands,请注意以下事项:
•AllowPartiallyTrustedCallers 属性会影响接口。
•
文章来源于领测软件测试网 https://www.ltesting.net/