Question

Je vais avoir du mal à comprendre pourquoi java codage sécurisé est important. Par exemple, pourquoi est-il important de déclarer des variables privées? Je veux dire que je reçois qu'il sera impossible d'accéder à ces variables à l'extérieur de la classe, mais je ne pouvais tout simplement décompiler la classe pour obtenir la valeur. De même, la définition d'une classe finale, il sera impossible de sous-classe de cette classe. Quand une classe serait sous-classement être dangereux pour la sécurité? Encore une fois, si nécessaire, je pourrais décompiler la classe originale et réimplémenter avec ce code malveillant je pourrais vouloir. Le problème vient quand les applications sont « de confiance » par l'utilisateur? Et les gens pourraient alors abuser de cette confiance en quelque sorte? En fait ce que je suis à la recherche est un bon exemple pour expliquer pourquoi les directives de codage sécurisé doivent être suivies.

Était-ce utile?

La solution

La programmation est dur.

Si vous définissez des API strictes, qui n'exposent pas les variables qui ne sont pas censés être exposés (que nous aimons appeler cette encapsulation ), vous aider les utilisateurs de vos API, et ainsi faciliter la programmation. Ceci est considéré comme une bonne chose.

Les raisons ne sont pas principalement la « sécurité », comme garder les choses secrètes secrètes, autant que la clarté, la simplicité, et la compréhensibilité.

En prime, il est beaucoup plus facile de faire les choses correctement si vous pouvez savoir que l'utilisateur de l'API ne change pas « vos » variables derrière le dos, bien sûr.

Autres conseils

Il est « sûr » qui signifie qu'une classe ouvrière interne sont cachées à celui qui l'utilise.

Le terme sécurisé n'est pas utilisé comme dans « sécurisation d'un serveur » est utilisé pour l'intention du fait qu'un utilisateur d'une classe n'a pas à se soucier de la façon dont la classe exécutera la tâche qu'il veut.

Prendre votre exemple:

L'exposition des variables d'une classe laisserait l'utilisateur de votre savoir de classe de leur existance, ce qui est quelque chose que vous ne voulez pas, par exemple: il suffit d'appuyer sur un bouton pour allumer la lumière, vous n'avez pas besoin maintenant qu'à l'intérieur il est en cuivre ou whater dont il a besoin pour effectuer la tâche.

Java est un programmation orientée objet langauge, et l'un des concepts clés dans la programmation orientée objet est encapsulation .

L'idée derrière l'encapsulation est de « cacher » les détails de mise en œuvre tels que les variables internes qui maintiennent l'état de l'objet et le fonctionnement interne tels que les algorithmes, et seulement fournir une interface que d'autres objets peuvent utiliser pour exécuter des fonctions avec l'objet.

En utilisant ce concept, on voudrait cacher les états internes en utilisant des variables pour empêcher private d'autres objets d'affecter directement les états internes. En Java, il est fréquent de voir des accesseurs (par exemple et getColor) afin setColor de travailler avec des objets.

En outre, l'encapsulation peut augmenter la robustesse du code.

Par exemple, en limitant l'accès aux états internes, il serait possible d'effectuer certains contrôles avant qu'un objet soit modifié.

Par exemple solide, dire qu'il y avait un objet qui devait Score avoir une valeur entre percent et 0 100. En fournissant un procédé qui valide setPercent(int) que la valeur spécifiée est dans la plage admissible, cela empêcherait l'objet score.percent = 150 d'être mis dans un état inacceptable.

Alors, en essayant de manipuler directement l'état interne en écrivant une déclaration comme setPercent pourraient être évités, si la méthode provoque une erreur Exception ou lance une si la valeur <=> spécifiée est inacceptable.

Il y a deux questions ici.

La première déclaration des variables comme protégées ou privées, ils ne feront pas partie de votre API publique. D'autres classes peuvent dépendre de votre classe à l'avenir, et il est important que vous êtes libre de changer autant que possible si vous voulez inclure de nouvelles fonctionnalités, d'améliorer les performances, etc. Si toutes vos valeurs sont publiques que tous vos internes les valeurs et les mécanismes sont publics. les changer peut briser d'autres classes qui dépendent de vous.

La seconde, est que lors de l'exposition variables, il permet à d'autres classes pour changer vos valeurs. Si elles changent vos valeurs internes se peut briser votre programme, et de créer un comportement inattendu étrange. Si vous créez un système qui repose sur la performance précise d'un de vos cours, et les valeurs internes sont changées, que vous ne pouvez plus compter sur ce système. Subclassing rend ce plus compliqué. Votre système peut se fonder sur une classe d'un certain type d'effectuer des actions prévues. Par le sous-classement, il est possible de créer une nouvelle classe qui semble être le même type, mais ne fonctionne pas les actions attendues.

, vous vous attendez à retourner la surface d'un carré Par exemple, si vous avez une place de classe avec une fonction protégée getArea (). Cependant, une nouvelle classe peut être qui s'étend carré, rectangle de dire classe étend carré. Maintenant rectange peut passer outre getArea (), mais il est encore de la place du type qui peut casser quelque chose qui dépend de cette fonctionnalité de la place. En rendant votre dernière classe vous affirmer que cela ne peut jamais se produire dans votre système.

Ce type de « sécuriser le codage » n'empêchera pas quelqu'un de voir votre code source, mais il aide à rendre votre code plus fiable et utilisable dans l'avenir.

Il suffit d'ajouter à ce que d'autres ont déjà dit: Certaines de ces caractéristiques peuvent aussi simplement être considéré comme un moyen d'affirmer l'intention. Si je fais un membre private je fais « impossible » pour les autres pour y accéder (il est possible, mais c'est d'ailleurs le point ici), mais plus important encore, je dis aux utilisateurs que c'est un détail de mise en œuvre, qu'ils ne devraient pas compter.

imaginez si votre objet possède une propriété interne qui n'est pas privé (caché) et votre code d'accès à cette propriété arriver à être exécuté dans un environnement multithread, donc N discussions commenceraient à accéder simultanément, 5 fils aimeraient changer cette propriété , 4 à lire. Il n'y a aucun moyen que vous assurer que les choses fonctionneront parfaitement, aucun thread ne sait quelles données qu'elle détient dans le moment et il a changé avec succès ne propriété de cet objet.

Vous devez programmer pièce spéciale de code qui sera chargé de gérer l'accès synchrone et encore qui n'aura pas être guarrantee votre code ne fonctionnera droit puisque vous toujours vérifier reste de 680 cours dans votre programme l'accès à cette propriété de ne pas y accéder directement.

En bref, vous êtes dans un énorme problème, et le débogage est un cauchemar puisque vous ne savez pas quand les données ont été chagned, qui a fait fil, d'où il happend etc.

Juste un scénario de ce qui se passe si vous n'encapsule pas ...

est une bonne chose, votre code fonctionne 1% plus rapide, il y a moins de charge sur la pile, vous avez réalisé des gains de performance probablement négligeable que vous devrez payer des accidents périodiques du système et les chances mineures pour le débogage Successfull.

Le terme « sécuriser le codage » fait référence à la construction de logiciels qui tentent clairement d'éviter les failles de sécurité, que ce soit en C, Java, Ruby, langage assembleur, ou toute autre chose. Peut-être la partie la plus centrale de cela, après avoir sélectionné un système linguistique sécurisé, est de garder les bonnes pratiques de programmation. Si un programme ne sait pas, alors vous avez peu de chances d'être digne de toute confiance.

Pour Java, il y a deux guides notables:

En Java, il existe deux modes distincts de codage sécurisé.

Dans un vous traitez avec le code qui peuvent ne pas avoir tous les privilèges que votre code ne. Par exemple, vous devez faire si vous écrivez un code bibliothèque ou la signature. Il devrait être impossible pour le code malveillant de tirer parti de vos autorisations de manière inattendue. Cela est difficile!

Le plus souvent vous faites affaire avec des programmes qui traitent des données uniquement non fiables. Par exemple, les serveurs Web (pensez XSS et injection SQL) et des programmes d'application de bureau traitant des fichiers non sécurisés (généralement le problème est avec le code C ayant les dépassements de tampon - véritable C ++ est mieux). Dans certaines situations, déni de service (DoS) peut être un problème grave.

Il y a un certain chevauchement. Par exemple les interprètes exécutent avec les permissions du code interprète et peut être tout à fait « puissants ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top