【问题标题】:How to prevent access via reflection?如何防止通过反射访问?
【发布时间】:2015-03-25 01:39:18
【问题描述】:

在 Java 文档中提到,使用 f.setAccessible(true) 方法可能违反封装原则。

但是,如果我正在编写任何具有完全安全性的类,例如使用私有变量,我该如何防止它被反射访问?

例如,我有一个具有完全安全实例变量的类:

public final class Immutable {
    private final int someVal;

    public Immutable(int someVal) {
        this.someVal = someVal;
    }

    public int getVal() {
        return someVal;
    }
}

但我可以像这样使用反射修改该实例变量:

public class Tester {
    public static void main(String[] args)
            throws NoSuchFieldException, SecurityException,
            IllegalArgumentException, IllegalAccessException {

        Immutable i = new Immutable(10);

        // output 10
        System.out.println(i.getVal());

        Field f = i.getClass().getDeclaredField("someVal");
        f.setAccessible(true);
        f.set(i, 11);

        // output is 11 which implies some value modified
        System.out.println(i.getVal());
    }
}

在我的代码中,如何防止不可变类被反射改变?

【问题讨论】:

  • 查看SecurityManager
  • 除非您让不知名的人将插件添加到您正在创建的东西中,否则您不必担心这一点。您要制作什么应用程序?
  • 如果您担心安全性,限制对反射的访问是不够的。如果不受信任的代码可以读取、写入或删除计算机上的任何文件,那么它无法访问某个对象属性对计算机的所有者没有多大帮助。

标签: java reflection


【解决方案1】:

JVM 具有内置的安全机制,允许您通过 Java 安全策略文件定义对代码的限制。 Java 安全管理器使用 Java 安全策略文件来强制执行授予类的一组权限。权限允许在该 JVM 实例中运行的指定类允许或不允许某些运行时操作。 如果启用 Java 安全管理器但未指定安全策略文件,Java 安全管理器将使用 $JAVA_HOME/jre/lib/security 目录中的 java.security 和 java.policy 文件中定义的默认安全策略。 定义你的策略文件可以在这里找到http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html

【讨论】:

    【解决方案2】:

    扩展 SecurityManager 类并重写此方法以限制反射访问

    @Override
    public void checkPackageAccess(String pkg){
    
             // don't allow the use of the reflection package
             if(pkg.equals("java.lang.reflect")){
                 throw new SecurityException("Reflection is not allowed!");
             }
         }
    

    【讨论】:

    • super.checkPackageAccess(pkg);缺的是很重要的!!!
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 2022-01-11
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多