Salut, je reçois la violation comme ci-dessous:
Vulnérabilité de code malveillant - Peut exposer une représentation interne en renvoyant une référence à un objet mutable
dans mon code, j'ai écrit comme ça
public String[] chkBox() {
return chkBox;
}
Comment pouvons-nous le résoudre.
Comme l'indique le message d'erreur, vous retournez l'état interne (chkBox fait - très probablement - partie de l'état interne d'un objet même si vous ne montrez pas sa définition)
Cela peut poser des problèmes si vous - par exemple - faites
String[] box = obj.chkBox();
box[0] = null;
Comme un objet tableau, comme tous les objets Java, est passé par référence, cela changera également le tableau d'origine stocké à l'intérieur de votre objet.
Ce que vous voudrez probablement faire pour résoudre ce problème est un simple
return (String[])chkBox.clone();
qui renvoie une copie du tableau au lieu du tableau réel.
Supposons ce qui suit:
Votre classe fait quelque chose qui compte du point de vue de la sécurité ou de la confidentialité, et que l'état de chkbox
est en quelque sorte utilisé dans l'implémentation des classes de ses mécanismes de confidentialité/sécurité.
La méthode chkBox()
peut être appelée par un code non approuvé.
Considérez maintenant ce code:
// ... in an untrusted method ...
Foo foo = ...
String[] mwahaha = foo.chkBox();
mwahaha[0] = "Gotcha!"; // ... this changes the effective state of `Foo`
En renvoyant une référence au tableau réel qui représente le chkbox
, vous autorisez le code externe à la classe Foo
à atteindre et à modifier son état.
C'est mauvais du point de vue de la conception (cela s'appelle une "abstraction qui fuit"). Cependant, si cette classe est utilisée dans un contexte où il peut également y avoir du code non fiable, cela (la méthode chkBox()
) est un trou de sécurité potentiel. C'est ce que le message de violation vous dit.
(Bien sûr, le vérificateur de code n'a aucun moyen de savoir si cette classe particulière est vraiment critique pour la sécurité. C'est à vous de comprendre. Ce qu'elle vous dit en réalité est "Hé! Regardez ici! C'est suspect! ")
Le correctif dépend du fait que ce code (ou bien l'ensemble de la bibliothèque ou de l'application) est critique pour la sécurité ... ou que le code soit critique pour la sécurité dans un déploiement futur. S'il s'agit d'une fausse alarme, vous pouvez simplement supprimer la violation; c'est-à-dire le marquer de manière à ce qu'il soit ignoré par le vérificateur. Si c'est un vrai problème (ou pourrait devenir un vrai problème), alors retournez une copie du tableau:
return (String[]) chkBox.clone();
Mais il est clair que le clonage de la baie a un coût de performance à chaque fois que vous appelez chkBox
. Vous pouvez également modifier la méthode chkBox
pour renvoyer un élément sélectionné du tableau:
public String chkBox(int i) {
return chkBox[i];
}
Dans ce cas, je soupçonne que l'approche alternative sera meilleure ... bien que cela dépende de la façon dont la méthode est actuellement utilisée.