2009-05-14 12 views
4

Tenir compte de cette classe d'échantillons,Accès méthodes statiques privées d'un contexte public static

class TargetClass { 
    private static String SENSITIVE_DATA = "sw0rdfish"; 

    private static String getSensitiveData() { 
     return SENSITIVE_DATA; 
    } 
} 

Quand je fais cela,

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); 
    } 
} 

La sortie est,

Sensitive Data: sw0rdfish 

Ceci est dangereux . Comment puis-je empêcher cela?

+1

En n'utilisant pas la réflexion? –

+0

Oui, bien sûr, si les programmeurs pensent uniformément de cette façon – Joset

Répondre

8
+0

résout la question mais vous pouvez toujours désassembler la classe (ou simplement utiliser un éditeur de texte pour voir ce qu'il ya dedans) –

+1

Ouais; il est stupide de stocker un mot de passe dans un champ final statique à partir de n'importe quel point de vue. – alamar

+0

C'est juste un exemple. Vous savez quelle est la véritable implication. – Joset

4

Le point de contrôle d'accès n'est pas d'empêcher quelqu'un de pirater votre code; C'est une question de signalisation destinée à d'autres programmeurs (par exemple, api design). Si vous ne faites pas confiance à l'autre programme, vous devez utiliser différentes mesures. Par exemple, vous pouvez crypter les données en quelque sorte.

Questions connexes