非 final public 静态和非 final public 实例字段在安全性方面的区别?
Difference between non- final public static and non- final public instance fields in terms of security?
我正在浏览这个 link , OBJ10-J. Do not use public static nonfinal fields 它说
Client code can trivially access public static fields because access
to such fields are not checked by a security manager.
他们的意思是什么?即他们所说的逃离安全管理器是什么意思?
如果他们的意思只是因为字段是 non-final 和 public
,那怎么会 non-final , public
实例字段与 static
对应字段不同? (就代码安全而言)
我已经解决了这个问题,但在安全方面没有看到任何提及,Why are static variables considered evil
public
class 的 public static
字段可以从任何地方访问,因此 public
实例字段也是如此,那么区别在哪里?为什么 non-final public
实例字段不是安全问题但 static
是?
那是因为 non-static 字段的情况已经被 OBJ01-J. Limit accessibility of fields
覆盖了
public
实例字段由 OBJ01-J 覆盖,原因略有不同。首先,您需要先引用实例才能更改 public 实例字段,而 public 静态字段可以直接在 class 级别访问。但两者都违反了 CERT 规则。
Why non-final public instance fields not a security issue but being static is?
如果您想访问一个实例字段,您需要对该对象实例的引用。如果您没有参考资料,则无法访问它。
因此您的代码可以控制将引用传递给哪些对象。如果恶意代码试图使用反射劫持您的对象之一以获取引用,您可以安装安全管理器来防止这种情况发生。
另一方面,每个有权访问 class 的人都可以访问 public static
字段,因为 Class
对象是可访问的。所以恶意代码可能只使用
YourClass.PUBLIC_INSTANCE_FIELD = someValue;
或反射方式
Class clazz = Class.forName("YourClass");
Field publicStaticField = clazz.getDeclaredField("PUBLIC_INSTANCE_FIELD");
publicStaticField.set(null, someValue);
我正在浏览这个 link , OBJ10-J. Do not use public static nonfinal fields 它说
Client code can trivially access public static fields because access to such fields are not checked by a security manager.
他们的意思是什么?即他们所说的逃离安全管理器是什么意思?
如果他们的意思只是因为字段是 non-final 和 public
,那怎么会 non-final , public
实例字段与 static
对应字段不同? (就代码安全而言)
我已经解决了这个问题,但在安全方面没有看到任何提及,Why are static variables considered evil
public
class 的 public static
字段可以从任何地方访问,因此 public
实例字段也是如此,那么区别在哪里?为什么 non-final public
实例字段不是安全问题但 static
是?
那是因为 non-static 字段的情况已经被 OBJ01-J. Limit accessibility of fields
覆盖了public
实例字段由 OBJ01-J 覆盖,原因略有不同。首先,您需要先引用实例才能更改 public 实例字段,而 public 静态字段可以直接在 class 级别访问。但两者都违反了 CERT 规则。
Why non-final public instance fields not a security issue but being static is?
如果您想访问一个实例字段,您需要对该对象实例的引用。如果您没有参考资料,则无法访问它。
因此您的代码可以控制将引用传递给哪些对象。如果恶意代码试图使用反射劫持您的对象之一以获取引用,您可以安装安全管理器来防止这种情况发生。
另一方面,每个有权访问 class 的人都可以访问 public static
字段,因为 Class
对象是可访问的。所以恶意代码可能只使用
YourClass.PUBLIC_INSTANCE_FIELD = someValue;
或反射方式
Class clazz = Class.forName("YourClass");
Field publicStaticField = clazz.getDeclaredField("PUBLIC_INSTANCE_FIELD");
publicStaticField.set(null, someValue);