Plugin jQuery pour l’affichage en clair des mots de passe au survol

Le problème a été relevé récemment dans plusieurs articles sur la sécurité : doit-on vraiment masquer les mots de passe dans les formulaires ?

Solution

Mot de passe en clair au survol

Mot de passe en clair au survol

La solution que je propose est relativement simple : lorsque le curseur de la souris survole le champ de mot de passe, celui-ci est affiché en clair. Sinon, il est masqué. L’explication est donnée en fin d’article.

Voici un premier jet de plugin jQuery qui permet de mettre en œuvre ce comportement :

(function($){
  $.fn.reveal = function() {
    this.filter('input[type="password"]').mouseover(function() {
      $(this).replaceWith(
        $('<input name="'+$(this).attr('name')+'" type="text" />')
          .attr('class', $(this).attr('class'))
          .val($(this).val())
          .mouseout(function() {
            $(this).replaceWith(
              $('<input name="'+$(this).attr('name')+'" type="password" />')
                .attr('class', $(this).attr('class'))
                .val($(this).val())
                .reveal()
            );
          })
      );
    });
    return this;
  };
})(jQuery);

Le plugin est relativement sommaire et peu complet (il correspond à une utilisation que j’en fait pour un projet personnel). Cependant, le principe est simple à comprendre et il est donc adaptable à d’autres situations.

Pour l’utiliser, il suffit d’appeler la fonction reveal() sur un objet jQuery (exemple : $('input.monPassword').reveal();).

Explication

Les arguments relevés dans l’article sont tout à fait judicieux : ne pas afficher le mot de passe est sujet à erreurs plus fréquentes et risque d’entraîner les utilisateurs à choisir des mots de passe plus faciles à taper. Des solutions plus ou moins bonnes ont été proposées, notamment par arc90 (HalfMask et HashMask). J’ai pu également lire une solution basée sur une case à cocher qui permettrait d’afficher ou masquer le mot de passe.

En ce qui me concerne, à l’exposé du problème j’ai pu identifier deux types d’utilisateurs : les utilisateurs novices ou standards, pour qui le masquage du mot de passe peut être un inconvénient et les utilisateurs avancés qui sont habitués à taper des mots de passe complexes correctement, et qui préfère généralement le masquage par défaut. La solution de la case à cocher est selon moi trop contraignante : le comportement par défaut risque d’agacer un des types d’utilisateurs.

En réfléchissant à la façon dont les deux types d’utilisateurs entraient un mot de passe (et plus généralement des données de formulaire), j’ai pu détacher un comportement relativement commun :  un utilisateur standard va très souvent cliquer sur le champ de formulaire pour l’indiquer tandis que l’utilisateur avancé va utiliser les contrôles clavier. Ainsi, la solution peut adopter un état par défaut (masquage ou affichage en clair) qui est deviné par rapport à ce comportement.

En l’occurrence, non seulement les utilisateurs standards cliquent sur le champ du formulaire, mais en général ils laissent le curseur dessus. C’est ce comportement précis qui dicte la solution expliquée plus haut.

Sans forcément être la solution idéale, je pense qu’elle a quelques avantages :

  • un état par défaut plus adapté au type d’utilisateur ;
  • un comportement relativement simple à comprendre et utiliser (plus qu’une case à cocher, a priori) ;
  • une réponse très générale, applicable à beaucoup d’autres cas d’utilisation ;
  • une sécurité une fois que l’utilisateur a compris le principe.

Le principal point faible est actuellement que ce comportement n’est pas naturel pour des personnes qui sont habituées à ne jamais voir leur mot de passe, et l’utilisateur standard est donc souvent surpris de lire son mot de passe en clair lorsqu’il lève les yeux du clavier. Une habitude est nécessaire pour que celui-ci pense à retirer la souris du champ du formulaire si une autre personne est présente dans la pièce.

(function($){
$.fn.reveal = function() {
this.filter(‘input[type="password"]‘).mouseover(function() {
$(this).replaceWith(
$(‘<input type=”text” name=”‘+$(this).attr(‘name’)+’” />’)
.attr(‘class’, $(this).attr(‘class’))
.val($(this).val())
.mouseout(function() {
$(this).replaceWith(
$(‘<input type=”password” name=”‘+$(this).attr(‘name’)+’” />’)
.attr(‘class’, $(this).attr(‘class’))
.val($(this).val())
.reveal()
);
})
);
});
return this;
};

2 commentaires à “Plugin jQuery pour l’affichage en clair des mots de passe au survol”

  1. Hi !

    Après avoir survolé l’article de Schneier et la solution que tu proposes, j’ai pas l’impression que tu restes cohérent.

    L’idée est sympa mais tu perds quand même le bénéfice du masquage du mot de passe.

    Premièrement, beaucoup d’utilisateurs risquent de préférer laisser le curseur pour être sûr de ne pas se cramer pendant la saisie.
    Deuxièmement, il y a ceux, comme tu le relèves, qui n’auront pas le réflexe de simplement survoler le champ password.

    Personnellement, j’apprécie la solution utiliser par Apple (désolé, et ce n’est pas du Mac FanBoy-isme!) dans leurs applicatifs qui consiste à n’affiche que le dernier caractère. On peut imaginer en afficher 2 ou 3. Ca permet de savoir ce que tu saisis sans révéler la totalité de ton mot de passe. Pas besoin d’acquérir un réflexe particulier,. …

    La solution HalfMask n’est pas mal non plus mais n’est pas très ‘accessible’. Les malvoyants ne pourront jamais déchiffrer, donc aucun intérêt pour ceux là.

    @tchaOo°

  2. Je sais pas, je pense que ça répond sur le papier aux deux problématiques à la fois : masquer aux regards indiscrets et pouvoir quand même vérifier ce qu’on a tapé, de la même façon que les solutions de arc90. La question est de savoir si dans la pratique, avec l’habitude – de la même façon que les gens ont appris inconsciemment que le mot de passe est masqué lors de la frappe, il faudrait qu’ils apprennent qu’ils peuvent le révéler au survol – cette solution est intéressante.

    La solution Apple que tu décris répond à moitié à chacune des deux : d’un côté les regards indiscrets peuvent voir une partie du mot de passe (et éventuellement deviner l’autre partie), et de l’autre l’utilisateur ne voit pas en totalité ce qu’il écrit (et ce n’est pas de l’anti-Mac :) ).

  3. * champ obligatoire