2012-02-02 72 views
0

我聽說反射機制打破了Java的安全性。請任何人都可以解釋它?訪問PRI:反射機制是否會破壞java中的安全性?請解釋一下

+0

您可以訪問使用反射的對象的私人字段 – 2012-02-02 12:00:47

+2

可能重複的[什麼是對象反射的安全風險?](http://stackoverflow.com/questions/3002904/what-is-the-security-risk-對象反射) – 2012-02-02 12:02:00

回答

1

你可以使用反射

例如

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://stackoverflow.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

1

使用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

2

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

首先我們需要一些上下文。通常情況下,Java平臺/可以/爲運行不可信代碼提供安全的環境(給出或採取奇怪的錯誤 - 如果你找到一個,請讓Oracle安全響應小組知道)。但是,Java的大部分用法都忽略了這一點。

安全運行時,反射API限制了不受信任的代碼可以做的事情,以簡化它可以在沒有反射的情況下執行的操作(除了一些標準的Java安全檢查之外,它還檢查直接調用方 - 請參閱Secure Coding Guidelines for the Java Programming Language)。例如,不受信任的代碼可以在同一個包中訪問「包私有」類,但不能訪問其他包中的包。

爲什麼要使用反射?通常是因爲它允許您代表某些客戶端代碼以相同的方式對一組開放式類型進行操作。客戶端代碼通常位於其他包中,但反射API將基於使用反射的代碼限制訪問。因此,除非反寫代碼能夠勝任編寫,否則客戶端代碼可以訪問,不應該被允許。這是一個豐富的漏洞來源。

當運行不安全時,您可以讀取/寫入文件,運行程序等,所以誰在乎?