4

考虑这个示例类,

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

这是危险的。我该如何防止这种情况发生?

4

2 回答 2

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 应该可以解决问题。

于 2009-05-14T09:18:59.633 回答
4

访问控制的重点不是防止有人侵入您的代码;这是向其他程序员发出信号的问题(例如,api设计)。如果您不信任其他程序,则应使用不同的措施运行。例如,您可以以某种方式加密数据。

于 2009-05-14T09:20:07.290 回答