在安全性方面,非最终公共实例和非最终公共实例字段之间的区别是什么?

时间:2016-01-11 09:12:21

标签: java java-security

我正在浏览此链接,OBJ10-J. Do not use public static nonfinal fields并且它说明了,

  

客户端代码可以通过访问来轻松访问公共静态字段   安全管理员不会检查这些字段。

他们究竟是什么意思?即逃离安全经理是什么意思?

如果他们只是因为字段非最终public而意味着它,那么非最终public实例字段的来源会有所不同比他们的static同行? (就代码安全而言)

我遇到过这个问题,并没有在安全方面提及任何提及,Why are static variables considered evil

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

2 个答案:

答案 0 :(得分:4)

那是因为OBJ01-J. Limit accessibility of fields

已涵盖非静态字段的情况 OBJ01-J涵盖

public实例字段,原因略有不同。首先,您需要在更改公共实例字段之前引用实例,而可以在类级别直接访问公共静态字段。但两者都违反了CERT规则。

答案 1 :(得分:4)

  

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

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

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

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

YourClass.PUBLIC_INSTANCE_FIELD = someValue;

或反思方式

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