反射机制是否会破坏java中的安全性?请解释一下

问题描述:

我听说反射机制打破了Java的安全性。请任何人都可以解释它?访问PRI:反射机制是否会破坏java中的安全性?请解释一下

+0

您可以访问使用反射的对象的私人字段 – 2012-02-02 12:00:47

+2

可能重复的[什么是对象反射的安全风险?](http://*.com/questions/3002904/what-is-the-security-risk-对象反射) – 2012-02-02 12:02:00

你可以使用反射

例如

public class Foo { 

    private String privateString = null; 

    public Foo(String privateString) { 
    this.privateString = privateString; 
    } 
} 

Foo privateObject = new Foo("The Private Value"); 

Field privateStringField = Foo.class. 
      getDeclaredField("privateString"); 

privateStringField.setAccessible(true); 

String fieldValue = (String) privateStringField.get(privateObject); 
System.out.println("fieldValue = " + fieldValue); 

+0

请你可以把这里的东西 – developer 2012-02-02 12:02:17

+0

http://*.com/questions/3567372/access-to-private-inherited-fields-via-reflection-in-java给出了一个示范。 – mcfinnigan 2012-02-02 12:03:59

+0

添加了示例 – 2012-02-02 12:04:03

使用reflection你几乎可以做任何事情进入私人领域对象的&方法瓦泰岛变量由setting them as accessable,并修改不可变对象

一个常见的例子,是改变String

public static void main(String[] args) throws Exception { 
    String s = "before"; 
    System.out.println(s); 
    Field value = String.class.getDeclaredField("value"); 
    value.setAccessible(true); 
    Field count = String.class.getDeclaredField("count"); 
    count.setAccessible(true); 
    char[] after = {'a','f','t','e','r','\0' }; 
    value.set(s, after); 
    count.set(s,5); 
    System.out.println(s); 
} 

在这个例子中 - 实际的字符串对象被改变了!

注意,使用反射来改变一个不可改变的对象有自己的问题,你可以在this post

显然,如果反射API显然打破了小应用程序的安全性看,有人已经注意到了。

首先我们需要一些上下文。通常情况下,Java平台/可以/为运行不可信代码提供安全的环境(给出或采取奇怪的错误 - 如果你找到一个,请让Oracle安全响应小组知道)。但是,Java的大部分用法都忽略了这一点。

安全运行时,反射API限制了不受信任的代码可以做的事情,以简化它可以在没有反射的情况下执行的操作(除了一些标准的Java安全检查之外,它还检查直接调用方 - 请参阅Secure Coding Guidelines for the Java Programming Language)。例如,不受信任的代码可以在同一个包中访问“包私有”类,但不能访问其他包中的包。

为什么要使用反射?通常是因为它允许您代表某些客户端代码以相同的方式对一组开放式类型进行操作。客户端代码通常位于其他包中,但反射API将基于使用反射的代码限制访问。因此,除非反写代码能够胜任编写,否则客户端代码可以访问,不应该被允许。这是一个丰富的漏洞来源。

当运行不安全时,您可以读取/写入文件,运行程序等,所以谁在乎?