代码之家  ›  专栏  ›  技术社区  ›  Will Dean

在完全信任的.EXE中是否需要担心链接需求?

  •  1
  • Will Dean  · 技术社区  · 14 年前

    我试图理解FxCop CA2122消息(可能是在禁用这些可怜的东西之前),显然我已经超越了对.NET CAS的理解。

    应用程序是.EXE, 用AllowPartiallyTrustedCallers标记。我们从代码分析中得到CA2122警告,抱怨我们未能将LinkDemand从调用的最低级别向上传播到具有LinkDemand的方法。

    显然,我们可以把linkdemand放在调用者上,然后放在调用者的调用者上,无限期。这似乎完全没有目的,因为对这段代码的每一次调用都是完全信任的,因此(AIUI)不管怎样,每个链接需求都将得到满足。埃里克·利珀特似乎也认为这样做是非常危险的。

    所以:

    • 我缺少什么程序集级属性来表示“此代码将只在完全信任的情况下运行”?(我认为没有AllowPartiallyTrustedCallers的存在暗示了这一点,但可能不适用于.EXEs)

    更新:我被问到我们使用的是哪个框架版本-它是2.0RTM,而且很难升级到超过这一点,因为它是在XPe平台上。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Nicole Calinoiu    14 年前

    您认为程序集将只作为完全可信的可执行文件运行的基本假设是错误的。没有什么能阻止某人将您的程序集用作恶意软件中的引用库程序集。如果您已更改计算机的CAS策略以授予程序集完全信任,而不管它是如何部署的,则恶意软件可能会使用您的程序集执行其本来没有足够权限的操作。

    这样做的结果是,不管您的部署方案是什么,您都应该做一些事情来阻止以调用代码的名义满足链接需求。考虑到你自己的目标是一个完全信任的场景,这实际上是相当容易的。 但是,确切的方法在很大程度上取决于您要针对的.NET框架的哪个版本,所以您可以发布详细信息吗?

    对于.NET 2.0,解决此问题的最简单方法是对程序集应用SecurityTransparentAttribute或SecurityCriticalAttribute。这两个属性都将导致程序集中的代码在默认情况下变得安全透明,这意味着它不能代表调用方执行诸如满足链接要求之类的操作。如果代码的某些部分需要执行不允许对透明代码进行安全性保护的操作,则应在程序集级别使用SecurityCriticalAttribute而不是SecurityTransparentAttribute,因为这样可以在需要时显式将类型和/或成员提升到安全关键级别。(有关更多详细信息,请参见 http://blogs.msdn.com/b/shawnfa/archive/2005/08/31/when-the-opposite-of-transparent-isn-t-opaque.aspx .)

        2
  •  1
  •   Eric Schneider    14 年前

    如果我理解正确: http://msdn.microsoft.com/en-us/library/system.security.allowpartiallytrustedcallersattribute.aspx

    AllowPartiallyTrustedCallers告诉.NET,你不在乎是谁调用它。

    似乎.NET 4中的安全模型发生了变化。