InternalsVisibleTo - 如何阻止某人创建具有相同名称的程序集并访问内部类或方法?

1 .net c# reflection .net-assembly c#-4.0

最近,我遇到了InternalsVisibleTo方法,使内部类和方法对其他程序集可见.虽然这在你有大量程序集的应用程序中非常有用,并且你想避免循环依赖或代码重复,但我们中的一些人认为这可能会暴露一个安全漏洞.你的想法是什么?

例如,如果我有一个属性:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("foo")]

即使将其隐藏在assemblyInfo.cs文件中,也可以通过反汇编等方式发现这一点.并非每个人都会对其组件进行签名或混淆.现在,有了可能有更多功能的信息,我可以创建自己的程序集foo.dll,然后使用我以前无法使用的方法/类.

Ily*_*gan 13

这里没有安全漏洞,因为公共/私人区别与安全无关.出于安全原因,成员不会被"隐藏"为私人,而是出于设计原因.任何人都可以通过反射找到所有私有方法,无论如何都要直接调用它们,即使InternalsVisibleTo没有设置.

  • 我所说的是这些私有方法可以从外部调用,**来自任何程序集**,即使没有设置InternalsVisibleTo. (2认同)

Sco*_*ain 6

如果您不想要"意外"替换(我不小心说因为成员可见性不是一种安全措施),您需要使用您想要显示的目标程序集的强名称签名(您的源程序集也需要强大)命名,请参阅MSDN的备注部分InternalsVisibleToAttribute).

所以以下属性

[assembly: InternalsVisibleTo("foo")]
Run Code Online (Sandbox Code Playgroud)

会变成

[assembly: InternalsVisibleTo("foo, PublicKey=002400000480000094" + 
                              "0000000602000000240000525341310004000" +
                              "001000100bf8c25fcd44838d87e245ab35bf7" +
                              "3ba2615707feea295709559b3de903fb95a93" +
                              "3d2729967c3184a97d7b84c7547cd87e435b5" +
                              "6bdf8621bcb62b59c00c88bd83aa62c4fcdd4" +
                              "712da72eec2533dc00f8529c3a0bbb4103282" +
                              "f0d894d5f34e9f0103c473dce9f4b457a5dee" +
                              "fd8f920d8681ed6dfcb0a81e96bd9b176525a" +
                              "26e0b3"")]
Run Code Online (Sandbox Code Playgroud)

然后,只有使用与属性中列出的公钥对应的私钥签名的程序集才能查看程序集的interals.