2016-07-14 5 views
2

Je suis en train de lire le CERT Secure Coding Standard for Java. Je suis aux prises avec ce rule. La gravité de cette règle est élevée, ce qui signifie qu'une violation de cette règle peut entraîner une escalade de privilèges ou l'exécution de code.Comment les références aux membres de la classe privée peuvent-elles être dangereuses?

Je ne comprends pas vraiment comment une violation de cette règle peut mener à de telles choses fatales. Quelqu'un peut-il donner l'exemple d'une attaque contre un code qui viole cette règle?

+2

Il existe déjà des exemples sur la page à laquelle vous avez un lien. Quel est le problème avec ceux? –

+0

Si vous exposez une référence à l'objet mutable privé, comme 'Date' ou toute 'Collection' modifiable, vous pouvez modifier l'état de votre objet de l'extérieur. Imaginez que vous avez la méthode 'List getNames()', vous pouvez l'appeler et ensuite appeler 'add (" name ")'. Ainsi, la personne qui utilise votre classe peut modifier l'état interne de l'instance. Voir aussi "Effective Java" de J. ** Bloch, 2e édition, article 39, p. 184 ** –

+0

aucun des exemples n'aboutit à une exécution de code ou à une élévation de privilèges ou ai-je tort? – Exagon

Répondre

2

Vous pouvez avoir un invariant que vous définissez dans le constructeur de la classe, par ex. que date contient le temps de création de l'instance:

class Foo { 
    private final Date date; 

    Foo() { this.date = new Date(); } 

    Date getDate() { return date; } 
} 

Maintenant, si je l'appelle getDate().setTime(0), je peux faire l'exemple ressembler, il a été créé à 1970-1-1 00:00:00Z.

Si vous avez une logique basée sur la date de création d'un Foo, il peut être manipulé pour se comporter différemment de cette manière.

0

En Java, vous contournez le spécificateur private en ayant une fonction non private qui renvoie une référence au membre. C'est parce qu'il est possible de modifier l'objet auquel le membre fait référence par le biais de cette référence.

Vous pouvez aussi bien être honnête à propos des choses, et marquer le membre private avec le même spécificateur d'accès que la fonction.

2

Si vous exposez une référence à l'objet mutable privé (par exemple Date ou tout Collection modifiable) sur le getter, vous pouvez modifier l'état de votre objet de l'extérieur.

Imaginez que vous avez méthode List<String> getNames() dans votre classe:

public class MyClass { 
    // fields and constructors are omitted 
    List<String> getNames() { 
     // return any mutable List implementation; for instance, ArrayList 
    } 
} 

Vous pouvez appeler myClass.getNames().add("name"), et cela modifiera l'état de l'instance MyClass. Ainsi, la personne qui utilise votre classe peut modifier l'état interne de ses instances.

Voir aussi 2e édition "Effective Java" de J. Bloch, article 39 "Faire des copies défensives en cas de besoin", p. 184, vous pouvez trouver une très bonne explication sur ce tiopic là.