我正在浏览此链接,OBJ10-J. Do not use public static nonfinal fields并且它说明了,
客户端代码可以通过访问来轻松访问公共静态字段 安全管理员不会检查这些字段。
他们究竟是什么意思?即逃离安全经理是什么意思?
如果他们只是因为字段非最终和public
而意味着它,那么非最终,public
实例字段的来源会有所不同比他们的static
同行? (就代码安全而言)
我遇到过这个问题,并没有在安全方面提及任何提及,Why are static variables considered evil
public
类的public static
字段可以从任何地方访问,因此public
实例字段也可以访问,那么区别在哪里?为什么非最终 public
实例字段不是安全问题,而是static
?
答案 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);