【问题标题】:Why would a .net web app need to check if the public key of the name of the CALLING assembly has the same length as the EXECUTING assembly's?为什么 .net Web 应用程序需要检查 CALLING 程序集名称的公钥是否与 EXECUTING 程序集的长度相同?
【发布时间】:2013-07-30 02:18:32
【问题描述】:

我继承的一个旧的 .NET Web 应用程序充满了奇怪的“程序集安全检查”:它检查 调用 程序集名称的公钥是否与公钥长度相同执行程序集的名称。

调用如下所示:

CheckAssembly(System.Reflection.Assembly.GetCallingAssembly(), System.Reflection.Assembly.GetExecutingAssembly(), this);

...那个方法是:

public static void CheckAssembly(Assembly callingAssembly, Assembly executingAssembly, object useObject)
    {
        byte[] assemblyPublicKey = executingAssembly.GetName().GetPublicKey();
        byte[] callingPublicKey = callingAssembly.GetName().GetPublicKey();
        if (callingPublicKey == null || assemblyPublicKey.Length != callingPublicKey.Length)
        {
            throw new SecurityException("The calling assembly does not have permission to use objects of type '" + useObject.GetType().FullName + "'");
        }
        for (int i = 0; i < assemblyPublicKey.Length; i++)
        {
            if (assemblyPublicKey[i] != callingPublicKey[i])
            {
                throw new SecurityException("The calling assembly does not have permission to use objects of type '" + useObject.GetType().FullName + "'");
            }
        }
    }
  1. 我认为它正在检查它的程序集(DLL 文件)是否没有被交换或修改或任何东西。那是对的吗?如果不是,这段代码在做什么?关于为什么会写它的任何猜测?

  2. 我认为 .net 框架无论如何都会这样做,如果需要的话。对吧?

  3. 也许这是应用程序是 winforms 应用程序而不是 Web 应用程序时的旧代码?由于它是一个网络应用程序,我们可以完全控制服务器上的 DLL,因此没有安全风险,对吗?

(如果需要可以提供更多信息)。

【问题讨论】:

  • 此代码的最佳位置是 thedailywtf.com
  • 感谢@HansPassant,所以我认为它完全没用的假设是否正确?
  • 我猜测第一次检查可能是为了避免进行第二次检查(我猜是更密集的)。我不知道它们多久会有不同的长度。

标签: .net reflection .net-assembly code-access-security


【解决方案1】:

您的三个假设可能是正确的,尽管#2 有一些奇怪的历史可能与此相关。有一个 .NET Framework CAS 权限 StrongNameIdentityPermission,可用于在 .NET 1.x 时代检查此类事情。但是,在 .NET 2.0 中,完全受信任的代码开始通过所有身份权限检查,包括 StrongNameIdentityPermission (http://blogs.msdn.com/b/eugene_bobukh/archive/2005/05/06/415217.aspx)。

在此行为更改之前,StrongNameIdentityPermission 的链接需求是人们用于创建半公共 API 的一种机制。这样做的主要缺点是被“保护”的类型和成员具有公共可见性,并且验证只发生在运行时。这意味着包含此类代码的库的好心用户在实际执行代码之前无法知道他们违反了预期的使用规则,这非常烦人。从 .NET 2.0 开始,创建半公共 API 的首选机制是使用 InternalsVisibleToAttribute 声明“friend assemblies”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多