反射是否打破了私有方法的概念,因为私有方法可以在类之外访问?

2022-08-30 14:42:12

反射会破坏私有方法的理念吗?因为私有方法可以从类外部访问?(也许我不明白反思的含义或错过了别的东西,请告诉我)http://en.wikipedia.org/wiki/Reflection_%28computer_science%29

编辑:如果 relection 打破了私有方法的概念 - 我们是否只将私有方法用于程序逻辑而不用于程序安全性?

谢谢


答案 1

我们是否仅将私有方法用于程序逻辑而不用于程序安全性?

不清楚您所说的“程序安全”是什么意思。安全问题不能在真空中讨论;它必须得到国际社会的普遍支持。您正在考虑保护哪些资源免受哪些威胁?

CLR 代码访问安全系统旨在保护用户数据资源免受用户计算机上运行的恶意部分受信任的代码的威胁。

因此,CLR 中的反射、访问控制和安全性之间的关系非常复杂。简而言之,不完全准确,规则如下:

  • 完全信任意味着完全信任。完全受信任的代码可以访问该过程中的每个内存位。这包括私有字段。

  • 在部分信任中对私有进行反思的能力由许可控制;如果未授予,则部分信任代码可能不会对私有进行反射。

有关详细信息,请参阅 http://blogs.msdn.com/b/shawnfa/archive/2006/09/29/777047.aspx

  • 桌面 CLR 支持一种称为“受限跳过可见性”的模式,在该模式下,反射和安全系统如何交互的规则略有不同。基本上,如果部分受信任的代码从具有相等较低信任的程序集的类型访问私有字段,则有权使用私有反射的部分受信任的代码可以通过反射访问私有字段。

http://blogs.msdn.com/b/shawnfa/archive/2006/10/05/using-lightweight-codegen-from-partial-trust.aspx

了解详情

执行摘要是:您可以充分锁定部分受信任的代码,使其无法使用反射来查看私有内容。您无法锁定完整的信任代码;这就是为什么它被称为“完全信任”。如果你想限制它,那么不要相信它

那么:将字段设为私有是否可以保护它免受低信任代码试图读取它的威胁,从而窃取用户的数据?是的。它是否保护它免受高信任代码读取它的威胁?不可以。如果代码既受用户信任又对用户充满敌意,则用户有一个大问题。他们不应该信任该代码。

请注意,例如,将字段设为私有并不能保护代码中的秘密免受拥有您的代码并且对您怀有敌意的用户的影响。安全系统保护好用户免受恶意代码的侵害。它不能保护好代码免受邪恶用户的侵害。如果你想把一些东西保密,以防止用户看到它,那么你就是在做一个愚蠢的差事。如果你想让它保密,以防止邪恶的黑客引诱用户运行敌对的低信任代码,那么这是一个很好的技术。


答案 2

反射确实提供了一种规避Java的访问保护修饰符的方法,因此违反了在C++和Java中实现的严格封装。但是,这并不像您想象的那么重要。

访问保护修饰符旨在帮助程序员开发模块化的、分解良好的系统,而不是成为不妥协的守门人。有时有很好的理由打破严格的封装,例如单元测试和框架开发

虽然最初可能很难忍受访问保护修饰符很容易规避的想法,但请记住,有许多语言(PythonRuby等)根本没有它们。这些语言用于构建大型和复杂的系统,就像提供访问保护的语言一样。

关于访问保护修饰符是帮助还是障碍,存在一些争论。即使您重视访问保护,也将其视为帮助之手,而不是项目的制作或破坏。


推荐