ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

要把代码隔离进被管理的托管环境中,通常的做法就是使用明确的策略(减少不同汇编集的许可等级)来产生多个子应用程序域。但是,这些汇编集策略在默认的应用程序域中仍然是不可改变的。如果子应用程序域中的任何一个能够强制默认的应用程序域来装载汇编集,那么就会失去代码隔离的作用并且在被强制装载的汇编集中的类型还能够运行拥有更高信任级别的代码。

应用程序域能够强制其他的应用程序域来装载一个汇编集并且运行通过调用而被包含在其他应用程序域中被托管对象的代理中的代码。要获得一个跨应用程序域的代理,应用程序域所托管的对象就必须分配一个通过方法所调用的参数或者返回值。或者,如果应用程序域正好被创建,那么创建者默认时就拥有一个对于 AppDomain 对象的代理。因此,要避免破坏代码的隔离,位于更高可信任级别中的应用程序域就不应该在它的域中为拥有更低可信任级别的应用程序域而分配对于通过引用而被编派的对象引用(MarshalByRefObject 的派生类实例)。

通常,默认的应用程序域会为每个控件对象而创建子应用程序域。控件对象管理新的应用程序域并且偶尔会从默认的应用程序域中获取一些命令,但是它无法直接与域产生实际的接触。有时候,默认的应用程序域会调用控件对象的代理。但是,这可能会导致控件对象对于默认应用程序域的回调产生依赖。在这些情况下,默认应用程序域会为控件对象构造器传递一个通过引用而被编派的回调对象。这是控件对象保护这个代理的责任。如果控件对象把代理存放到一个公开类的公开的静态字段中,或者另外公开地暴露了这个代理,那么这将为其他代码对于默认应用程序域的回调而开启一个危险的机制。出于这个原因,控件对象始终都应该隐式地被信任来保持代理的私有化。

posted on 2007-02-14 18:25  Laeb  阅读(283)  评论(0编辑  收藏  举报