10

我正在通过这个链接,OBJ10-J。不要使用公共静态非最终字段,它说,

客户端代码可以轻松访问公共静态字段,因为安全管理器不会检查对此类字段的访问。

他们实际上是什么意思?即从安全管理器中逃脱是什么意思?

如果他们只是说它是因为字段是非最终的public那么为什么非最终public实例字段与它们的static对应字段不同?(就代码安全而言)

我已经通过这个问题并且没有看到任何关于安全性的提及,为什么静态变量被认为是邪恶的

public类的public static字段可以从任何地方访问,所以public实例字段也可以访问,那么区别在哪里?为什么非最终 public实例字段不是安全问题,而是存在static

4

2 回答 2

5

为什么非最终公共实例字段不是安全问题而是静态的?

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

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

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

YourClass.PUBLIC_INSTANCE_FIELD = someValue;

或反射方式

Class clazz = Class.forName("YourClass");
Field publicStaticField = clazz.getDeclaredField("PUBLIC_INSTANCE_FIELD");
publicStaticField.set(null, someValue);
于 2016-01-11T09:28:25.817 回答
4

这是因为OBJ01-J已经涵盖了非静态字段的情况。限制字段​​的可访问性

publicOBJ01-J 涵盖了实例字段,原因略有不同。一方面,您需要在更改公共实例字段之前引用一个实例,而公共静态字段可以在类级别直接访问。但两者都违反了 CERT 规则。

于 2016-01-11T09:17:16.197 回答