当前位置: 首页 > 面试题库 >

反射安全

华福
2023-03-14
问题内容

如何通过不允许执行反射安全MethodFieldConstructor对象调用setAccessible(true)?SecurityPolicy文件还是其他?

通常,对于独立Java应用程序,没有SecurityManager注册。

我用这个 System.setSecurityManager(new SecurityManager());

这种方法适用于调用方法

我想强制执行整个jar或使用该jar的客户端代码,不允许调用 setAccessible(true);

有更好的方法吗?

谢谢。


问题答案:

嗯,它 确实 适用于setAccessible。看到:

class A {
  private String method1() {
    return "Hello World!";
  }
}

import java.lang.reflect.Method;

class B {
  public static void main(String[] args) throws Exception {
    System.setSecurityManager(new SecurityManager());
    Class clazz = A.class;
    Method m = clazz.getDeclaredMethod("method1");
    m.setAccessible(true);
  }
}

结果是

Exception in thread "main" java.security.AccessControlException: access denied ("java.lang.reflect.ReflectPermission" "suppressAccessChecks")
        at java.security.AccessControlContext.checkPermission(Unknown Source)
        at java.security.AccessController.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkPermission(Unknown Source)
        at java.lang.reflect.AccessibleObject.setAccessible(Unknown Source)
        at B.main(B.java:8)

它可能对你没有工作的原因之一是,根据评论这篇文章并没有在Java 1.5中使用的工作,但在6,此后的作品。

编辑:要拒绝特定的jar,需要使用一个策略文件,例如:

// specific file
grant codeBase "file:/test/path/tools.jar" {
  // no permissions for this one
};

// default to giving all
grant {
  permission java.security.AllPermission;
};

有两种指定策略文件的方法,或者将其作为默认文件的补充,或者仅提供指定的文件(源):

如果您使用

java -Djava.security.manager -Djava.security.policy==someURL SomeApp

(请注意,双等于)将仅使用指定的策略文件;安全属性文件中指示的所有内容都将被忽略。

…或实现一个看起来并不难的自定义安全管理器。我自己还没做过。



 类似资料:
  • 主要内容:反射的用途,查看元数据反射(Reflection)是指程序可以访问、检测和修改它本身状态或行为的一种能力,反射中提供了用来描述程序集、模块和类型的对象,可以使用反射动态地创建类型的实例,并将类型绑定到现有对象,或者从现有对象中获取类型,然后调用其方法或访问其字段和属性。 如果代码中使用了特性,也可以利用反射来访问它们。 反射的用途 C# 中反射具有以下用途: 在运行时查看视图属性信息; 检查装配中的各种类型并实例化这些

  • 我正在使用以下内容: 当它到达时,我得到以下异常: 的包是 那么,为什么会抛出那个错误呢?如果你需要更多的信息,请让我知道。谢了!

  • Reflection对象用于在运行时获取类型信息。 提供对正在运行的程序的元数据的访问的类位于System.Reflection命名空间中。 System.Reflection命名空间包含的类允许您获取有关应用程序的信息,并动态地向应用程序添加类型,值和对象。 反射的应用 反射有以下应用 - 它允许在运行时查看属性信息。 它允许检查程序集中的各种类型并实例化这些类型。 它允许后期绑定到方法和属性

  • 本小节我们来学习一个 Java 语言中较为深入的概念 —— 反射(reflection),很多小伙伴即便参与了工作,可能也极少用到 Java 反射机制,但是如果你想要开发一个 web 框架,反射是不可或缺的知识点。本小节我们将了解到 什么是反射,反射的使用场景,不得不提的 Class 类,如何通过反射访问类内部的字段、方法以及构造方法等知识点。 1. 什么是反射 Java 的反射(reflecti

  • 公共技术点之 Java 反射 Reflection 原文链接:Android 开源项目源码解析 1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数、属性、父类、接口等 Class 内部信息的机制。通过反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值,即使方法或属性是私有的的也可以通过反射的形式调用

  • Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 反射概述 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造