1

我继承的一个旧 .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,所以没有安全风险,对吗?

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

4

1 回答 1

1

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

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

于 2013-08-01T15:05:24.123 回答