【发布时间】:2013-07-21 17:36:04
【问题描述】:
我目前正在研究 java 安全性并遇到了一个奇怪的现象。 java中的SecurityManager存储在java.lang.System中的“security”字段中。有趣的是,该字段似乎受到保护以防止反射访问,这确实是有道理的,但据我所知,该字段是唯一的。所以这里是例子:
for(Field f : System.class.getDeclaredFields())
System.out.println(f);
输出
public static final java.io.InputStream java.lang.System.in
public static final java.io.PrintStream java.lang.System.out
public static final java.io.PrintStream java.lang.System.err
private static volatile java.io.Console java.lang.System.cons
private static java.util.Properties java.lang.System.props
private static java.lang.String java.lang.System.lineSeparator
有趣的是:声明为
的字段private static volatile SecurityManager security = null;
不在列表中,果然调用了
System.class.getDeclaredField("security");
产生 NoSuchFieldException。因为我在网上找不到任何关于这个的信息,而且我很确定这个字段曾经可以通过反射访问(例如,请参见 2010 年的这个blog post,它描述了访问这个字段)我想知道 a)是这个实现为快速修复,以防止通过反射轻松禁用安全管理器,以及 b) 如何实现(或者更确切地说,是否有机会保护其他私有字段免受反射)。
【问题讨论】:
-
如果我没记错的话,这个字段无法访问是因为引入了一个补丁来关闭 Java 小程序中的安全漏洞。不是 100% 确定。
-
这确实很有趣,因为如果有反射,有几种不同的方法可以禁用安全管理器..
标签: java security reflection