在我的.net应用程序中,我想限制对某些程序集的反射。我的意思是我希望我的特定程序集只能通过一些预定义的程序集来反映,而不是通过任何其他程序集。我怎么能这样做?
This tool完全关闭.NET反汇编和程序集的反编译。我想允许一些预定义的程序集来反映这个程序集,但是限制其他人这样做。我想要一些应该被声明为装配的东西,例如: AssemblyOne已授予AssemblyTwo你可以反映我的权限,因此只有AssemblyTwo能够以完全信任的方式反映它,而不是其他任何人。
答案 0 :(得分:9)
您链接的工具基本上将整个应用程序编译为本机代码。这并没有真正“关闭”反射或其他任何东西,它只是将应用程序变成完全不同的东西,它不再是字节码,而不再是技术上的.NET程序集。
具有完全信任的呼叫者可以始终在.NET程序集及其内部的所有内容上使用反射。除了(a)混淆,任何有足够耐心和决心的人都可以去混淆,或者(b)编译成本机代码,这会阻止任何类型的反射(以及许多其他有用的功能),你不能阻止这种情况发生,你当然不能将它限制在特定的程序集中。
ReflectionPermissionAttribute
与其他答案所说的相反,不会阻止来电者反映 您的代码;相反,它控制从访问代码到反射API。这里没有任何帮助。
为什么隐藏代码或类结构如此重要?除非你是为NSA工作,否则大多数代码都没有那么有价值/秘密,而且大多数应用程序在给定足够的时间和资源的情况下很容易进行逆向工程。实际上,攻击者或剽窃者从复制代码中复制代码和/或使用Reflection来发现您的API时,收效甚微。
我想我只能为自己说话,但是如果有一天免费实现一个很酷的功能或投资试图保护内部代码,我会一直致力于实际增加价值的新功能。
答案 1 :(得分:5)
如果此人完全信任程序集,则无法阻止他们访问程序集的任何部分。
答案 2 :(得分:4)
反思是不可抗拒的! : - )
除了编写本机代码之外,我认为你不能阻止反射。而且,这可以被拆解。如果您需要保留一些未经授权的代码,请将其保存在您控制的服务器上,并允许远程访问它。
答案 3 :(得分:2)
我想知道你想要限制反思的场景是什么。您是否担心将一些超级秘密数据暴露在您的代码库中?一些非常聪明的代码,你有一些优势吗?
我问的原因是我只是不相信我们在软件开发中所做的任何事情本身在代码库级别是如此独特,以至于它需要人们不要看它 - 所以我想知道你是否走错了路。既然你没有提到为什么要阻止反射,我不知道你的场景是否有意义(至少从我的POV中)限制访问。
我无法想象一个现实世界的场景,限制访问真的会在任何地方得到 - 这不是现在制造系统的任何特定代码块的光彩,它是完整的包(UX,客户服务,快速进化与使用保持同步等)。如果你的代码是好的,它会随着时间的推移而改变,所以任何人“破解”它将比你当前的迭代(至少)落后两步。 你的价值是你的大脑,而不是大会。
如果你出于安全原因这样做,那么你真的不应该试图通过阻止反射来“保护”它。
同样,你可能有正当理由阻止我没有想过的反思,但我怀疑这是值得的,我宁愿相信你的能量会更好地花在其他地方......就像在制作中一样你希望阻止的代码更好。