繁体   English   中英

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

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

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

客户端代码可以简单地访问公共静态字段,因为安全管理器不会检查对这些字段的访问。

那是什么意思呢? 即逃离安全经理他们是什么意思?

如果它们只是意味着因为字段是非最终的public ,那么非最终的 public实例字段与static字段的不同之处呢? (就代码安全而言)

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

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

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

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

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

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

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

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

YourClass.PUBLIC_INSTANCE_FIELD = someValue;

或反思方式

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM