Les champs de mot de passe doivent-ils conserver leurs valeurs si un formulaire ne passe pas la validation?

J'ai un formulaire d'inscription typique avec deux champs de mot de passe.

<form>
    <%= Html.TextBox("Email", null) %>

    <%= Html.Password("password", null) %>
    <%= Html.Password("confirmPassword", null) %>

    <input type='submit' />
</form>

Si le formulaire échoue à la validation et est ré-affiché, le champ de texte conserve sa valeur mais les champs de mot de passe sont toujours vides.

Pourquoi les champs de mot de passe ne devraient-ils pas conserver leurs valeurs?{[9] } et plus important encore, y a-t-il une raison pour laquelle je ne devrais pas remplacer ce comportement?

J'ai l'impression que ce comportement diminue la facilité d'utilisation, et je préférerais que les champs de mot de passe se comportent de la même manière que les champs de zone de texte -- conserver la valeur saisie lorsque des erreurs de validation existent.

J'utilise ASP.NET MVC, mais cette question concerne plus la facilité d'utilisation et la sécurité. Je comprends que ce que je vois est un comportement attendu, et jeter un oeil à la méthode Password(...) me montre qu'elle ignore explicitement la valeur dans ModelState.

27
demandé sur Scott Rippey 2011-07-01 00:18:04

5 réponses

Vous pouvez renvoyer la valeur sur un champ type=password d'entrée normal.

Toutefois, si vous utilisez le contrôle d'entrée. net, il effacera le contenu de la valeur avant de renvoyer le code html au client.

La raison est simple: ils voulaient limiter le nombre de fois où un mot de passe a été envoyé entre le serveur et le navigateur. Cela permet de limiter l'exposition à certains systèmes.(lien)

Maintenant, évidemment, si vous utilisez ssl puis ce n'est pas beaucoup d'un examen. Malheureusement, la grande majorité des sites n'utilisent toujours pas SSL et enverront volontiers des données en clair. Plus le champ se déplace entre le client et le serveur, plus quelqu'un a de possibilités de le saisir ala FireSheep.

Gardez à l'esprit que cela ne veut pas dire que quelqu'un qui écoute toute la conversation ne l'obtiendra pas dès le premier post. Cependant, considérez - le comme une option simple pour limiter (pas éliminer) l'attaque surface.

La raison suivante est que presque chaque fois que les sites affichent le champ de mot de passe à l'utilisateur après une soumission, c'est parce que la validation n'a pas passé. Cela pourrait signifier que le nom d'utilisateur et/ou mot de passe est incorrect. Considérant que les champs de mot de passe n'affichent que des astérisques ou des points à l'utilisateur, il n'y a aucune raison réelle de le leur rendre.

Étant donné que vous ne voulez jamais dire à l'utilisateur lequel des identifiants a échoué (c'est-à-dire: vous ne voulez pas dire "mot de passe invalide" ou " nom d'utilisateur invalide") et que les utilisateurs communs n'ont aucun moyen de déterminer s'ils ont doigts gras leur entrée, il est beaucoup mieux à mon humble avis pour effacer les deux.


Tout cela mis à part, vous avez le choix ici. La norme est de l'effacer. Considérant que c'est la façon dont la grande majorité des sites fonctionnent, voulez-vous vraiment aller à l'encontre du grain? Personnellement, je trouve que nous sommes beaucoup mieux de coller aux normes de L'interface utilisateur, même lorsque nous sommes en désaccord avec eux.

Les utilisateurs ont déjà un temps assez dur avec toutes les différentes options disponibles.

16
répondu NotMe 2011-06-30 21:09:14

Les réponses soumises par @ NickHeidke et @ Chris Lively étaient toutes deux excellentes et m'ont conduit à quelques conclusions que j'aimerais partager.

Tout d'abord, en ce qui concerne la convivialité: le seul endroit où il pourrait être approprié pour un champ de mot de passe pour conserver sa valeur est sur un formulaire "INSCRIPTION", lorsque le formulaire ne passe pas la validation, et le problème de validation N'est pas lié au mot de passe ou confirmer le mot de passe. Il n'est certainement pas approprié pour un formulaire de "connexion", un formulaire de "changement de mot de passe" ou probablement tout autre lieu. Par conséquent, le fait que Html.Password ignore la ModelState est parfaitement logique.

Deuxièmement, en ce qui concerne la sécurité: à moins d'être soigneusement mis en œuvre, un formulaire "inscription" sera enregistré dans l'historique de navigation de votre navigateur. Appuyer sur "Retour" renverra votre mot de passe, ce qui échouerait probablement à la validation, et retournera le formulaire avec votre mot de passe rempli. Le fait que le mot de passe soit rempli n'est pas une violation de sécurité, car c'est le même mot de passe que le navigateur déjà enregistré et envoyé. Vous pouvez "afficher la Source" pour voir le mot de passe, mais vous pouvez également afficher la demande de page pour voir le mot de passe (par exemple, en utilisant FireBug).

Certes, il est plus facile et plus évident de "voir la Source" quand vous voyez un mot de passe rempli, mais je dirais que la meilleure solution consiste à implémenter le formulaire "INSCRIPTION" d'une manière qui n'est pas enregistrée dans l'historique du navigateur; par exemple, le modèleprg avec une solution de contournement de Validation , mais

Mon la conclusion est la suivante: les champs de mot de passe devraient presque toujours être clairs lorsqu'ils sont affichés. Si vous voulez augmenter la facilité d'utilisation et ne voulez pas obliger les utilisateurs à retaper leurs mots de passe, essayez d'utiliser validation côté client en premier! Et enfin, si vous savez vraiment ce que vous faites, et que vous voulez vraiment augmenter la convivialité, c'est ok pour conserver les valeurs d'un formulaire d'inscription. Mais ce n'est probablement pas la meilleure idée.

11
répondu Scott Rippey 2017-05-23 12:09:24

L'explication que j'ai entendue pour cela dans le passé, est que si un utilisateur clique sur Soumettre et s'éloigne de son ordinateur, quelqu'un d'autre ne devrait pas être en mesure de venir et de se soumettre à nouveau à leur insu.

3
répondu NickHeidke 2011-06-30 20:55:27

Réponse donnée par @ Scott Rippey, explique vraiment beaucoup. Vous ne pouvez pas conserver la valeur de @ Html.Mot de passe ou @ Html.PasswordFor car il est codé en dur dans l'assistant lui-même. de plus, référez-vous à ce lien. conserver la valeur du mot de passe.

Solution: Ce que vous pouvez faire, c'est remplacer le mot de passe ou la boîte de mot de passe par,

@Html.TextBoxFor(x => x.Password, new { type = "password" })
1
répondu Swarup Rajbhandari 2017-05-23 12:09:24

Bien que je convienne que lorsque la connexion sur ce comportement est raisonnable, il pense qu'il fournit une expérience utilisateur extrêmement pauvre quand disons, la création d'un compte d'utilisateur. Quand il y a beaucoup de champs sur un formulaire et que l'utilisateur fait une erreur dans un ou plusieurs champs, devoir saisir à nouveau les mots de passe (nouveau et confirmer) est très très ennuyeux, et quand les champs de mot de passe ne sont pas visibles sans défilement, il est très facile d'oublier de les saisir à nouveau.

0
répondu Chris DB 2013-02-10 12:43:40