非 final public 静态和非 final public 实例字段在安全性方面的区别?

Difference between non- final public static and non- final public instance fields in terms of security?

我正在浏览这个 link , OBJ10-J. Do not use public static nonfinal fields 它说

Client code can trivially access public static fields because access to such fields are not checked by a security manager.

他们的意思是什么?即他们所说的逃离安全管理器是什么意思?

如果他们的意思只是因为字段是 non-finalpublic ,那怎么会 non-finalpublic 实例字段与 static 对应字段不同? (就代码安全而言)

我已经解决了这个问题,但在安全方面没有看到任何提及,Why are static variables considered evil

public class 的 public static 字段可以从任何地方访问,因此 public 实例字段也是如此,那么区别在哪里?为什么 non-final public 实例字段不是安全问题但 static 是?

那是因为 non-static 字段的情况已经被 OBJ01-J. Limit accessibility of fields

覆盖了

public 实例字段由 OBJ01-J 覆盖,原因略有不同。首先,您需要先引用实例才能更改 public 实例字段,而 public 静态字段可以直接在 class 级别访问。但两者都违反了 CERT 规则。

Why non-final public instance fields not a security issue but being static is?

如果您想访问一个实例字段,您需要对该对象实例的引用。如果您没有参考资料,则无法访问它。

因此您的代码可以控制将引用传递给哪些对象。如果恶意代码试图使用反射劫持您的对象之一以获取引用,您可以安装安全管理器来防止这种情况发生。

另一方面,每个有权访问 class 的人都可以访问 public static 字段,因为 Class 对象是可访问的。所以恶意代码可能只使用

YourClass.PUBLIC_INSTANCE_FIELD = someValue;

或反射方式

Class clazz = Class.forName("YourClass");
Field publicStaticField = clazz.getDeclaredField("PUBLIC_INSTANCE_FIELD");
publicStaticField.set(null, someValue);