如果可以通过反射绕过访问修饰符,它们的目的是啥?

Posted

技术标签:

【中文标题】如果可以通过反射绕过访问修饰符,它们的目的是啥?【英文标题】:What is the purpose of access modifiers if they can be bypassed with reflection?如果可以通过反射绕过访问修饰符,它们的目的是什么? 【发布时间】:2019-12-25 19:29:06 【问题描述】:

我知道在编写 Java(或大多数)代码时使用访问修饰符是一种重要的做法,但是您可以使用反射绕过这些修饰符这一事实是否有效地使其变得多余?

例如,如果我想通过将对象敏感变量设置为私有并提供访问器方法来保护我的对象敏感变量,那么仍然有人可以轻松进入并使用反射绕过它,并可能设置不安全的值。为什么 Java 提供访问修饰符,然后提供绕过它们的工具?似乎两者都不使用会更容易。

【问题讨论】:

我还能闯进来,你为什么还要锁门? 你也可以配置一个SecurityManager来防止反射。 您会发现很多大型 Java 框架,例如 Hibernate 和 Jackson,在后台使用反射来分析您的对象并找出如何处理它们,而无需指定它们的行为详细的。如果你真的,真的想阻止反射访问你的对象的内部,你总是可以创建一个安全策略来阻止它。 访问修饰符主要防止人们意外地做他们不应该做的事情。你不能真正阻止一个坚定的“攻击者”故意做他们不应该做的事情。如果他们通过反射设置了一个值,并且库/框架/任何东西都没有按预期工作,那就很难了。 就像 Michael 解释的那样,让它变得更难确实是一个原因,但是您可以防止意外,并展示您打算如何让“谁”(类)和“哪里”使用您的代码(包)。 【参考方案1】:

访问修饰符的一个重要目的是构建代码并帮助该代码的用户有效、正确地理解和使用它。这与用作防篡改安全机制不同。因此,同时拥有访问修饰符和反射并不矛盾。代码的编写者可以使用访问修饰符来表达他们的意图,而无论出于何种原因需要绕过它们的代码都可以这样做,但会带来通常的风险和影响。

【讨论】:

【参考方案2】:

我认为修饰符的优点是您可以更快地知道如何使用文件/库。没有反射就无法访问私有字段/方法。

对于您希望防止攻击者使用反射的情况,JVM 具有一种安全机制,允许您通过 Java 安全策略文件定义对代码的限制。除非您另外指定,否则它将使用默认值。

使用 SecurityManager 和足够严格的安全策略运行您的应用程序,可以在 here 找到策略。

您可能会发现本教程很有用:http://docs.oracle.com/javase/tutorial/essential/environment/security.html

【讨论】:

以上是关于如果可以通过反射绕过访问修饰符,它们的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]

方法有那些访问控制修饰符,分别是啥作用

如果您可以通过反射访问它们,那么拥有私有构造函数有啥意义?

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

访问修饰符也会影响反射吗?