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