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 に答える