[英]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.