Précédent   Forum du club des développeurs et IT Pro > Le club des professionnels en informatique > La taverne du Club : Humour et divers
La taverne du Club : Humour et divers Divers, détente et humour. Pour le Chat, c'est ici : -> Le Chat
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/11/2012, 15h10   #1
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 283
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 283
Points : 32 761
Points : 32 761
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
Par défaut ll me reste un peu d'antipattern, je vous en remet?

Aujourd'hui, je développais une application spring (ouais ouais, je sais), plus particulièrement, je configurais la sécurité et le hashage des mots de passe.

Je me loggue + pas à pas: les hash sont les mêmes, et pourtant je suis jeté. Bizarre me dis-je, j'ai du rater qqch. Je réessaie et là: plus de hash, le hash stocké de l'utilisateur a disparu de la mémoire (je précise que c'est par rapport à ce hash qu'on vérifie ce que l'utilisateur a entré). Je fouille et vla ti pas que je trouve le coupable dans spring security:

Code java :
1
2
3
4
5
6
7
8
9
10
11
12
 
    /**
     * @deprecated Use the exception message or use a custom exception if you really need additional information.
     */
    @Deprecated
    public AuthenticationException(String msg, Object extraInformation) {
        super(msg);
        if (extraInformation instanceof CredentialsContainer) {
            ((CredentialsContainer) extraInformation).eraseCredentials();
        }
        this.extraInformation = extraInformation;
    }
Deux anti-pattern pour le prix d'une:
-> Logique buisness / effet de bord dans une Exception (alors que cette logique devrais se trouver dans le catch correspondant)
-> logique buisness dans une constructeur (autant faire les choses en beautés).

Oui, vous avez bien lu, si l'utilisateur tappe un mauvais mot de passe, on efface tout ce qu'on a de lui en mémoire. Et tant pis si on stockait les données uniquement en mémoire

On rajoute à ça:
- comportement non documenté
- Passage d'un "Object" très typé
- Appel d'un constructeur déprécié

Notez qu'on est bien conscient là qu'on est occupé d'effacer un password du store puisque l'appel est

Code java :
1
2
3
4
5
6
7
        if (!passwordEncoder.isPasswordValid(userDetails.getPassword(), presentedPassword, salt)) {
            logger.debug("Authentication failed: password does not match stored value");
 
            throw new BadCredentialsException(messages.getMessage(
                    "AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"),
                    includeDetailsObject ? userDetails : null);
        }
(presentedPassword étant ce que j'ai tappé au prompt)
Notez aussi le flag ambigu "includeDetailsObject" qui, à true, a in fine l'effet de supprimer des détails
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/11/2012, 16h38   #2
leternel
Expert Confirmé
 
Homme Pierre
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 1 207
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 1 207
Points : 2 552
Points : 2 552
Adorable, en effet.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
  • Une variable de moins est une source d'erreur en moins.
  • Un pointeur de moins est une montagne d'erreurs en moins.
  • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
  • La plus sotte des questions est celle qu'on ne pose pas.
leternel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 10h15   #3
Médinoc
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 22 390
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2005
Messages : 22 390
Points : 32 032
Points : 32 032
Envoyer un message via MSN à Médinoc
Je suis d'accord sur le fait que ça ne devrait pas se trouver dans le constructeur, mais d'un autre côté je trouve normal de supprimer les credentials le plus tôt possible (logguer un mauvais mot de passe peut donner des informations sur le vrai mdp s'il y a eu typo, etc.).

En fait, le problème n'est pas tant qu'on efface les credentials, mais qu'on le fasse sur l'original (effet de bord). La chose à faire serait de cloner le extraInformation et filtrer la copie.
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone.
-- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 11h13   #4
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 283
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 283
Points : 32 761
Points : 32 761
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
Citation:
Envoyé par Médinoc Voir le message
En fait, le problème n'est pas tant qu'on efface les credentials, mais qu'on le fasse sur l'original (effet de bord). La chose à faire serait de cloner le extraInformation et filtrer la copie.
extraInformation etant de type "inconnu", impossible à cloner.

La chose propre aurait été de prendre un type bien précis, d'extraire les informations voulue dans le constructeur et de ne stocker que ces informations

Bref, rien de ce qui a été fait
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h06.


 
 
 
 
Partenaires

Hébergement Web