考虑这个示例类
class TargetClass {
private static String SENSITIVE_DATA = "sw0rdfish";
private static String getSensitiveData() {
return SENSITIVE_DATA;
}
}
当我这样做时,
import java.lang.reflect.Method;
public class ClassPiercing {
public static void main(String... args) throws Exception {
Class targetClass = Class.forName("TargetClass");
Method[] methods = targetClass.getDeclaredMethods();
methods[0].setAccessible(true);
String sensitiveData = (String)methods[0].invoke(null, null);
System.out.println("Sensitive Data: " + sensitiveData);
}
}
输出是,
Sensitive Data: sw0rdfish
这很危险。我该如何防止这种情况发生?
答案 0 :(得分:8)
好吧,使用SecurityManager。
http://java.sun.com/javase/6/docs/api/java/lang/SecurityManager.html
http://java.sun.com/javase/6/docs/technotes/guides/security/permissions.html#ReflectPermission
禁用ReflectPermission应该可以解决问题。
答案 1 :(得分:4)
访问控制的目的不是阻止某人侵入您的代码;这是向其他程序员发出信号的问题(例如api设计)。如果您不信任其他程序,则应运行不同的度量。例如,您可以以某种方式加密数据。