Désactiver la fonctionnalité «Enregistrer le mot de passe» du navigateur

423

L'une des joies de travailler pour une agence gouvernementale de soins de santé est de devoir faire face à toute la paranoïa liée au traitement des PHI (Protected Health Information). Ne vous méprenez pas, je suis tout pour faire tout ce qui est possible pour protéger les informations personnelles des gens (santé, finances, habitudes de surf, etc.), mais parfois les gens deviennent un peu trop nerveux.

Exemple: un de nos clients d'État a récemment découvert que le navigateur fournit la fonctionnalité pratique pour enregistrer votre mot de passe. Nous savons tous qu'il est là depuis un certain temps et qu'il est complètement facultatif et qu'il appartient à l'utilisateur final de décider s'il s'agit d'une décision intelligente à utiliser ou non. Cependant, il y a un peu de tumulte en ce moment et on nous demande de trouver un moyen de désactiver cette fonctionnalité pour notre site.

Question : Existe-t-il un moyen pour un site de dire au navigateur de ne pas proposer de se souvenir des mots de passe? Je travaille depuis longtemps sur le développement Web, mais je ne sais pas si je l'ai déjà rencontré auparavant.

Toute aide est appréciée.

mattsmith321
la source
6
Vous devez fournir un script greasemonkey afin que les gens puissent le réactiver. Je ne pense pas que les utilisateurs aiment être obligés de taper le mot de passe à chaque fois ...
ThiefMaster
14
La question mérite un vote positif car elle est utile et claire. D'un autre côté, je ne veux pas que les gens trouvent une solution à ce "problème".
Ian Boyd
11
Ce n'est pas toujours un "problème". Je suis venu ici parce que Firefox vous invite à enregistrer un mot de passe pour un formulaire contenant un mot de passe WiFi / SSID, pas un formulaire de nom d'utilisateur / mot de passe de connexion. C'est très ennuyeux et je veux l'arrêter.
2014
1
Si les informations sont essentielles, elles doivent être protégées par plus qu'un simple mot de passe.
Sam Watkins
Une façon dont cela semble fonctionner est de ne pas utiliser <form>. Si vous utilisez javascript pour envoyer les données (XHR), vous n'en avez pas besoin. Je voulais désactiver dans un système qui utilise l'authentification "à mot de passe unique" (aucune raison de le stocker). Pour les authentifications utilisateur / passe, je ne recommanderais pas de désactiver cette fonctionnalité.
lepe

Réponses:

322

Je ne sais pas si cela fonctionnera dans tous les navigateurs, mais vous devriez essayer de définir autocomplete = "off" sur le formulaire.

<form id="loginForm" action="login.cgi" method="post" autocomplete="off">

Le moyen le plus simple et le plus simple de désactiver les invites de stockage de formulaire et de mot de passe et d'empêcher la mise en cache des données de formulaire dans l'historique de session consiste à utiliser l'attribut d'élément de formulaire de saisie semi-automatique avec la valeur "off".

Depuis http://developer.mozilla.org/En/How_to_Turn_Off_Form_Autocompletion

Quelques recherches mineures montrent que cela fonctionne dans IE mais je ne laisse aucune garantie;)

@Joseph : Si c'est une exigence stricte de passer la validation XHTML avec le balisage réel (je ne sais pas pourquoi, cependant), vous pourriez théoriquement ajouter cet attribut avec javascript par la suite, mais ensuite les utilisateurs avec js désactivé (probablement une quantité négligeable de votre base d'utilisateurs ou zéro si votre site nécessite js) auront toujours leurs mots de passe enregistrés.

Exemple avec jQuery:

$('#loginForm').attr('autocomplete', 'off');
Markus Olsson
la source
48
Juste un commentaire rapide, car cela change, HTML5 ajoute l'attribut de saisie semi-automatique à la spécification, il est donc valide maintenant.
Tyler Egeto
11
Juste Pour votre information, Microsoft a décidé que Internet Explorer 11 ne sera plus l' honneur autocomplete="off"des input type="password"champs. msdn.microsoft.com/en-us/library/ie/ms533486%28v=vs.85%29.aspx
JW Lim
6
Tout comme @JWLim a mentionné la suppression de la prise en charge par IE 11 de la désactivation de la fonctionnalité d'enregistrement de mot de passe, Firefox l'est également. bugzilla.mozilla.org/show_bug.cgi?id=956906
Gregory Cosmo Haun
3
Firefox (malheureusement) a suivi l'exemple de Microsoft et a également "supprimé" la prise en charge de la saisie semi-automatique. Pour plus de détails, voir le commentaire 100 dans la discussion de problème suivante: bugzilla.mozilla.org/show_bug.cgi?id=956906
Bouncing Bit
8
Maintenant, ne fonctionne pas pour Firefox 38+ mozilla.org/en-US/firefox/38.0/releasenotes
Illuminator
44

En plus de

autocomplete="off"

Utilisation

readonly onfocus="this.removeAttribute('readonly');"

pour les entrées que vous ne voulez pas de se rappeler des données de formulaire ( username, password, etc.) comme indiqué ci - dessous:

<input type="text" name="UserName" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

<input type="password" name="Password" autocomplete="off" readonly 
    onfocus="this.removeAttribute('readonly');" >

Testé sur les dernières versions des principaux navigateurs à savoir Google Chrome, Mozilla Firefox, Microsoft Edge, etc. , et fonctionne comme un charme. J'espère que cela t'aides.

Murat Yıldız
la source
2
@Murat Yıldız: Je dois implémenter la même chose et j'ai suivi votre code, cela fonctionne très bien pour moi dans tous les navigateurs. Merci !
Sree
1
@Sree Je suis heureux que cela vous ait été utile :)
Murat Yıldız
3
Je viens de tester Mozilla Firefox 52.0 , Google Chrome 57.0 , Microsoft Edge 38.1 et fonctionne comme un charme! ..
Murat Yıldız
1
Il peut y avoir une erreur dans Safari mobile car cette réponse le corrige stackoverflow.com/questions/2530/…
Ferie
1
Windows Firefox 57.0.2 (64 bits) suggère toujours d'enregistrer le mot de passe après l'avoir implémenté.
Panu Haaramo
37

J'avais lutté avec ce problème pendant un certain temps, avec une tournure unique au problème. Les utilisateurs privilégiés ne pouvaient pas faire fonctionner les mots de passe enregistrés pour eux, mais les utilisateurs normaux en avaient besoin. Cela signifiait que les utilisateurs privilégiés devaient se connecter deux fois, la deuxième fois sans appliquer de mots de passe enregistrés.

Avec cette exigence, la autocomplete="off"méthode standard ne fonctionne pas sur tous les navigateurs, car le mot de passe peut avoir été enregistré lors de la première connexion. Un collègue a trouvé une solution pour remplacer le champ de mot de passe lorsqu'il était ciblé par un nouveau champ de mot de passe, puis se concentrer sur le nouveau champ de mot de passe (puis connecter le même gestionnaire d'événements). Cela a fonctionné (sauf qu'il a provoqué une boucle infinie dans IE6). Peut-être qu'il y avait un moyen de contourner cela, mais cela me causait une migraine.

Enfin, j'ai essayé d'avoir juste le nom d'utilisateur et le mot de passe en dehors du formulaire. À ma grande surprise, cela a fonctionné! Il a fonctionné sur IE6 et les versions actuelles de Firefox et Chrome sur Linux. Je ne l'ai pas testé plus loin, mais je soupçonne que cela fonctionne dans la plupart sinon tous les navigateurs (mais cela ne me surprendrait pas s'il y avait un navigateur qui ne se souciait pas s'il n'y avait pas de formulaire).

Voici quelques exemples de code, ainsi que quelques jQuery pour le faire fonctionner:

<input type="text" id="username" name="username"/>
<input type="password" id="password" name="password"/>

<form id="theForm" action="/your/login" method="post">
  <input type="hidden" id="hiddenUsername" name="username"/>
  <input type="hidden" id="hiddenPassword" name="password"/>
  <input type="submit" value="Login"/>
</form>

<script type="text/javascript" language="JavaScript">
  $("#theForm").submit(function() {
    $("#hiddenUsername").val($("#username").val());
    $("#hiddenPassword").val($("#password").val());
  });
  $("#username,#password").keypress(function(e) {
    if (e.which == 13) {
      $("#theForm").submit();
    }
  });
</script>
Mike Stone
la source
1
Cela ressemble à une bonne solution. Cela a du sens puisque le formulaire que vous envoyez ne comprend pas lui-même de mot de passe. Je suppose que vous pouvez avoir deux formulaires, le premier juste pour vous assurer que le nom d'utilisateur et le mot de passe sont visibles dans tous les navigateurs.
Alexis Wilke
3
j'aime votre solution et j'ai implémenté une solution similaire sur mon site, c'est ridicule comment aujourd'hui, les navigateurs n'offrent pas un moyen simple de résoudre ce problème.
AgelessEssence
Je ne sais pas si c'est parce que je suis bloqué en utilisant jquery 1.6, mais le jquery ci-dessus n'a fonctionné qu'après avoir été placé dans un $ (document) .ready (function () {});
rgbflawed
La seule soultion correcte est la suivante car certains navigateurs n'accepteront plus autocomplete = "off"!
Abadis
1
Je viens d'essayer cette méthode sur Chrome, Opera et Internet Explorer et cela semble fonctionner, mais cela ne fonctionne pas avec Firefox de manière imprévue
Chenks
29

Eh bien, c'est un très vieux poste, mais je vais quand même donner ma solution, que mon équipe essayait depuis longtemps de réaliser. Nous venons d'ajouter un nouveau champ de type d'entrée = "mot de passe" à l'intérieur du formulaire et de l'envelopper dans div et de le masquer. Assurez-vous que ce div est avant la saisie du mot de passe réel. Cela a fonctionné pour nous et n'a donné aucune option Enregistrer le mot de passe

Plunk - http://plnkr.co/edit/xmBR31NQMUgUhYHBiZSg?p=preview

HTML:

<form method="post" action="yoururl">
      <div class="hidden">
        <input type="password"/>
      </div>
      <input type="text" name="username" placeholder="username"/>
      <input type="password" name="password" placeholder="password"/>
    </form>

CSS:

.hidden {display:none;}
whyAto8
la source
1
Un avantage de cette façon par rapport à ceux qui utilisent des entrées cachées est que de cette façon, un mot de passe n'est jamais stocké dans un champ en texte clair
pvgoddijn
@ whyAto8 Cela n'a pas fonctionné pour moi dans Chrome 47.0.2526.111 ... l'astuce pour le faire fonctionner était d'ajouter un autre texte de champ dans la div cachée. Le navigateur demande d'enregistrer le mot de passe MAIS il dit "Etes-vous sûr de sauvegarder ces crendetials?" puis il affiche un nom d'utilisateur vide et un mot de passe vide. Cela a fonctionné.
David Bélanger
1
La solution de whyAto8 avec le commentaire de @David Bélanger a fonctionné pour moi (aucune des autres solutions ne l'a fait). Je dois également mentionner que j'ai ajouté les deux champs masqués vides AVANT ceux réellement utilisés pour la saisie de données, et les champs dupliqués (masqués) avaient les mêmes noms respectifs. De cette façon, Chrome (48.0.2564.103) n'a même pas demandé si un mot de passe devait être enregistré.
Vadim
Aucune combinaison de cela ne fonctionne sur Chrome 48.0.2564.116. Même combiné avec le commentaire de DavidBelanger, la fenêtre contextuelle Chrome vous demandant d'enregistrer le mot de passe met toujours le mot de passe en cache si vous cliquez sur OK
ChrisO
Grande réponse .. Pouvez-vous me dire pourquoi vous avez dit "Assurez-vous que ce div est avant la saisie du mot de passe" ? Je mets cette div après la saisie du mot de passe et ça fonctionne toujours. Alors pourquoi avez-vous mentionné cela?
Martin AJ
16

Vous pouvez empêcher le navigateur de faire correspondre les formulaires en randomisant le nom utilisé pour le champ de mot de passe à chaque émission. Ensuite, le navigateur voit un mot de passe pour la même URL, mais ne peut pas être sûr qu'il s'agit du même mot de passe . C'est peut-être contrôler quelque chose d'autre.

Mise à jour: notez que cela devrait être en plus d' utiliser la saisie semi-automatique ou d'autres tactiques, pas un remplacement pour eux, pour les raisons indiquées par d'autres.

Notez également que cela empêchera uniquement le navigateur de compléter automatiquement le mot de passe. Cela ne l'empêchera pas de stocker le mot de passe dans le niveau arbitraire de sécurité que le navigateur choisit d'utiliser.

Joel Coehoorn
la source
5
[@Joel] (# 32409) qui pourrait empêcher le formulaire d'être rempli automatiquement, mais cela empêcherait-il le navigateur de demander ensuite d'enregistrer le mot de passe pour ce nouveau formulaire supposé ?
Joseph Pecoraro
3
Je ne pense pas que cela fonctionnera maintenant. Dans FF 13, j'ai un formulaire avec plusieurs champs de mot de passe, tous avec des noms différents. FF, une fois qu'il a enregistré un mot de passe pour cette page, colle le mot de passe enregistré dans TOUS les champs de mot de passe. Peu importe le nom des champs (j'ai "new_password" et "old_password" par exemple, et le mot de passe enregistré est vidé dans les deux). Dans ce formulaire particulier, je n'ai pas de nom d'utilisateur pour enregistrer le mot de passe - juste deux champs de mot de passe, au cas où cela ferait une différence.
Jason
1
Nods @Jason, donner au champ de mot de passe un nouvel UUID pour un nom à chaque fois n'a rien fait pour contrer les tentatives du navigateur de le remplir.
FP Freely
14

Utilisez une véritable authentification à deux facteurs pour éviter la seule dépendance vis-à-vis des mots de passe qui pourraient être stockés dans beaucoup plus d'endroits que le cache du navigateur de l'utilisateur.

David Schmitt
la source
2
btw c'est authentification pas authentification
Jonathan.
26
@Jonathan Pity, je préfère l' authentification
Ian Boyd
Une autre solution pourrait être d'implémenter un JavaScript, qui ferme de force le navigateur une fois que l'utilisateur est déconnecté de l'application. Cela va vider la mémoire complète du navigateur, et donc aucune donnée ne peut être récupérée de la mémoire du navigateur.
Ajay Takur
13

La façon la plus propre est d'utiliser autocomplete="off"l'attribut tag mais Firefox ne lui obéit pas correctement lorsque vous changez de champs avec Tab.

La seule façon d'arrêter cela est d'ajouter un faux champ de mot de passe caché qui incite le navigateur à y saisir le mot de passe.

<input type="text" id="username" name="username"/>
<input type="password" id="prevent_autofill" autocomplete="off" style="display:none" tabindex="-1" />
<input type="password" id="password" autocomplete="off" name="password"/>

C'est un vilain piratage, car vous modifiez le comportement du navigateur, ce qui devrait être considéré comme une mauvaise pratique. Utilisez-le uniquement si vous en avez vraiment besoin.

Remarque: cela arrêtera efficacement le remplissage automatique du mot de passe, car FF "enregistrera" la valeur de #prevent_autofill(qui est vide) et essaiera de remplir tous les mots de passe enregistrés, car il utilise toujours la première type="password"entrée qu'il trouve dans DOM après le "nom d'utilisateur" respectif contribution.

venimus
la source
À quoi bon empêcher le navigateur de saisir le mot de passe mais lui permettre de le stocker? Cela incite l'utilisateur à penser que son mot de passe n'est pas stocké alors qu'il est réellement vulnérable.
CodesInChaos
De cette façon, il ne stockera pas réellement votre mot de passe, car vous tapez dans l'autre case, qui est ignorée par FF. Au lieu de cela, il stockera une chaîne vide.
venimus
@CodesInChaos À mon humble avis, vous devriez reconsidérer votre vote négatif, car votre préoccupation n'est pas valide
venimus
12

J'ai testé que l'ajout de autocomplete = "off" dans la balise de formulaire dans tous les principaux navigateurs. En fait, la plupart des peuples des États-Unis utilisent IE8 jusqu'à présent.

  1. IE8, IE9, IE10, Firefox, Safari fonctionnent très bien.

    Le navigateur ne demande pas "enregistrer le mot de passe". De plus, le nom d'utilisateur et le mot de passe précédemment enregistrés ne sont pas renseignés.

  2. Chrome et IE 11 ne prennent pas en charge la fonctionnalité de saisie semi-automatique = "off"
  3. FF supportant l'autocomplete = "off". mais parfois les informations d'identification enregistrées existantes sont renseignées.

Mis à jour le 11 juin 2014

Enfin, ci-dessous est une solution multi-navigateur utilisant javascript et cela fonctionne bien dans tous les navigateurs.

Besoin de supprimer la balise "form" dans le formulaire de connexion. Après la validation côté client, mettez ces informations d'identification sous forme masquée et soumettez-les.

Ajoutez également deux méthodes. un pour la validation "validateLogin ()" et un autre pour écouter l'événement enter en cliquant sur enter dans la zone de texte / mot de passe / bouton "checkAndSubmit ()". car maintenant le formulaire de connexion n'a pas de balise de formulaire, entrez donc l'événement ne fonctionne pas ici.

HTML

<form id="HiddenLoginForm" action="" method="post">
<input type="hidden" name="username" id="hidden_username" />
<input type="hidden" name="password" id="hidden_password" />
</form>

Username: <input type="text" name="username" id="username" onKeyPress="return checkAndSubmit(event);" /> 
Password: <input type="text" name="password" id="password" onKeyPress="return checkAndSubmit(event);" /> 
<input type="button" value="submit" onClick="return validateAndLogin();" onKeyPress="return checkAndSubmit(event);" /> 

Javascript

//For validation- you can modify as you like
function validateAndLogin(){
  var username = document.getElementById("username");
  var password = document.getElementById("password");

  if(username  && username.value == ''){
    alert("Please enter username!");
    return false;
  }

  if(password && password.value == ''){
    alert("Please enter password!");
    return false;
  }

  document.getElementById("hidden_username").value = username.value;
  document.getElementById("hidden_password").value = password.value;
  document.getElementById("HiddenLoginForm").submit();
}

//For enter event
function checkAndSubmit(e) {
 if (e.keyCode == 13) {
   validateAndLogin();
 }
}

Bonne chance!!!

Asik
la source
Bien que cette réponse fournisse des informations utiles, elle ne répond pas vraiment à la question de savoir comment empêcher les navigateurs d'enregistrer les mots de passe.
JW Lim
@JW Lim, j'ai mis à jour la réponse. Veuillez l'examiner. Merci!
Asik
@Sivakumar, Ok, veuillez inclure le système d'exploitation et la version de Safari. afin que d'autres personnes en soient conscientes. il fonctionnait dans mon système (windows 8, Safary 5)
Asik
@Asik Safari 8.0.3 et Mac OS 10.10
Sivakumar
7

Pas vraiment - la seule chose que vous pourriez faire de façon réaliste est d'offrir des conseils sur le site; peut-être qu'avant leur première connexion, vous pouvez leur montrer un formulaire contenant des informations indiquant qu'il n'est pas recommandé de laisser le navigateur stocker le mot de passe.

Ensuite, l'utilisateur suivra immédiatement les conseils, notera le mot de passe sur un post-it et l'enregistrera sur son moniteur.

Jason Bunting
la source
10
Vous devez vous rappeler que c'est un site gouvernemental , et de telles choses sont politiquement chargées. Si quelqu'un en haut dit "ça ne doit pas fonctionner comme ça", alors ce qui est réaliste ne fait pas partie de l'équation. Le problème peut être déplacé vers des notes post-it, mais la politique à ce sujet est pour un département différent à gérer - le problème a été déplacé ;-) Et je suis en fait sérieux.
Jason
6

Ce que j'ai fait est une combinaison de saisie semi-automatique = "off" et d'effacement des champs de mot de passe à l'aide d'un javascript / jQuery.

Exemple jQuery:

$(function() { 
    $('#PasswordEdit').attr("autocomplete", "off");
    setTimeout('$("#PasswordEdit").val("");', 50); 
});

En utilisant, setTimeout()vous pouvez attendre que le navigateur termine le champ avant de l'effacer, sinon le navigateur se terminera toujours automatiquement après avoir effacé le champ.

Howard Young
la source
3

si autocomplete = "off" ne fonctionne pas ... supprimez la balise de formulaire et utilisez une balise div à la place, puis transmettez les valeurs du formulaire à l'aide de jquery au serveur. Cela a fonctionné pour moi.

Nikhil Dinesh
la source
3

Parce que l'autocomplete = "off" ne fonctionne pas pour les champs de mot de passe, il faut se fier à javascript. Voici une solution simple basée sur les réponses trouvées ici.

Ajoutez l'attribut data-password-autocomplete = "off" à votre champ de mot de passe:

<input type="password" data-password-autocomplete="off">

Inclure le JS suivant:

$(function(){
    $('[data-password-autocomplete="off"]').each(function() {
        $(this).prop('type', 'text');
        $('<input type="password"/>').hide().insertBefore(this);
        $(this).focus(function() {
            $(this).prop('type', 'password');
        });
    });     
});

Cette solution fonctionne pour Chrome et FF.

mfernandes
la source
Windows Firefox 57.0.2 (64 bits) suggère toujours d'enregistrer le mot de passe après l'avoir implémenté.
Panu Haaramo
2

Juste pour que les gens le réalisent - l'attribut 'autocomplete' fonctionne la plupart du temps, mais les utilisateurs expérimentés peuvent le contourner en utilisant un bookmarklet.

Le fait qu'un navigateur enregistre vos mots de passe augmente en fait la protection contre le keylogging, donc probablement l'option la plus sûre est d'enregistrer les mots de passe dans le navigateur mais de les protéger avec un mot de passe principal (au moins dans Firefox).

Thrawn
la source
2
"mais les utilisateurs expérimentés peuvent contourner ce problème" - cela s'applique à la plupart des fonctionnalités des applications, Web ou non, et ne devrait pas être une raison pour limiter le système. Les gens peuvent également écrire leurs mots de passe sur des post-its et les mettre sur leur moniteur, vous ne pouvez pas faire grand-chose pour la sécurité du point de vue de l'application, et fournir un comportement par défaut significatif (ne pas l'enregistrer localement) est un début.
Niels Keurentjes
2

J'ai un travail à faire, ce qui peut aider.

Vous pouvez créer un hack de police personnalisé. Donc, faites une police personnalisée, avec tous les caractères comme un point / cercle / étoile par exemple. Utilisez-la comme police personnalisée pour votre site Web. Vérifiez comment faire cela dans Inkscape: comment créer votre propre police

Ensuite, sur votre formulaire de connexion, utilisez:

<form autocomplete='off'  ...>
   <input type="text" name="email" ...>
   <input type="text" name="password" class="password" autocomplete='off' ...>
   <input type=submit>
</form>

Ajoutez ensuite votre css:

@font-face {
    font-family: 'myCustomfont';
    src: url('myCustomfont.eot');
    src: url('myCustomfont?#iefix') format('embedded-opentype'),
         url('myCustomfont.woff') format('woff'),
         url('myCustomfont.ttf') format('truetype'),
         url('myCustomfont.svg#myCustomfont') format('svg');
    font-weight: normal;
    font-style: normal;

}
.password {
  font-family:'myCustomfont';
}

Compatible avec plusieurs navigateurs. J'ai essayé IE6 +, FF, Safari et Chrome. Assurez-vous simplement que la police oet que vous convertissez n'est pas corrompue. J'espère que cela aide?

Dai Bok
la source
1
solution vraiment sympa il y a une police de mot de passe ici
andrew
6
Si vous utilisez une telle solution, vous devez tenir compte du fait que les utilisateurs peuvent copier librement le texte entré dans ce champ de mot de passe similaire. Les fonctions de copie et de découpe sont désactivées sur les vrais champs de mot de passe.
2

Le moyen le plus simple de résoudre ce problème consiste à placer les champs INPUT à l'extérieur de la balise FORM et à ajouter deux champs masqués à l'intérieur de la balise FORM. Ensuite, dans un écouteur d'événements de soumission avant que les données du formulaire ne soient soumises au serveur, copiez les valeurs de l'entrée visible vers les invisibles.

Voici un exemple (vous ne pouvez pas l'exécuter ici, car l'action de formulaire n'est pas définie sur un vrai script de connexion):

<!doctype html>
<html>
<head>
  <title>Login & Save password test</title>
  <meta charset="utf-8">
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
</head>

  <body>
      <!-- the following fields will show on page, but are not part of the form -->
      <input class="username" type="text" placeholder="Username" />
      <input class="password" type="password" placeholder="Password" />

      <form id="loginForm" action="login.aspx" method="post">
        <!-- thw following two fields are part of the form, but are not visible -->
        <input name="username" id="username" type="hidden" />
        <input name="password" id="password" type="hidden" />
        <!-- standard submit button -->
        <button type="submit">Login</button>
      </form>

    <script>
      // attache a event listener which will get called just before the form data is sent to server
      $('form').submit(function(ev) {
        console.log('xxx');
        // read the value from the visible INPUT and save it to invisible one
        // ... so that it gets sent to the server
        $('#username').val($('.username').val());
        $('#password').val($('.password').val());
      });
    </script>

  </body>
</html>

genou-cola
la source
Windows Firefox 57.0.2 (64 bits) suggère toujours d'enregistrer le mot de passe après l'avoir implémenté.
Panu Haaramo
eh bien, c'était juste un hack, qui pourrait cesser de fonctionner à tout moment :)
knee-cola
C'est la meilleure solution! effacez simplement le champ du mot de passe avant de soumettre: $ ('. password'). val ('')
ebelendez
2

Ma solution de contournement js (jquery) consiste à changer le type d'entrée du mot de passe en texte sur le formulaire soumis . Le mot de passe pourrait devenir visible pendant une seconde, donc je cache également l'entrée juste avant cela. Je préfère ne pas l'utiliser pour les formulaires de connexion , mais cela est utile (avec autocomplete = "off"), par exemple dans la partie administration du site Web.

Essayez de mettre cela dans une console (avec jquery), avant de soumettre le formulaire.

$('form').submit(function(event) {
    $(this).find('input[type=password]').css('visibility', 'hidden').attr('type', 'text');
});

Testé sur Chrome 44.0.2403.157 (64 bits).

ovalek
la source
1
Cela fonctionne réellement. Cela empêche le navigateur d'enregistrer le mot de passe. Pour éviter d'afficher le mot de passe, vous pouvez envelopper le champ de saisie dans une div masquée. Et vous pouvez déjà le faire si le DOM est chargé, pas besoin d'attendre d'avoir envoyé le formulaire.
Ferry Kranenburg
Fonctionne sur IE 11.0.9600.18161!
Lu55
C'est vrai. Maintenant, j'ai essayé cela dans FF 44.0.2 et ce hack ne fonctionne plus ... quel dommage. Dans Chrome, cela fonctionne toujours.
ovalek
Vous pouvez remplacer l'entrée [type = soumettre] ou le bouton [type = soumettre] par un bouton normal [type = bouton] et le faire dans le gestionnaire onclick. Si aucun [type = soumettre] n'est présent dans le formulaire, cela empêchera également le formulaire d'être soumis avec la clé d'entrée et l'invite de sauvegarde du mot de passe de s'afficher.
Steven Don
2

J'ai testé de nombreuses solutions. Nom de champ de mot de passe dynamique, plusieurs champs de mot de passe (invisibles pour les faux), changement du type d'entrée de "texte" en "mot de passe", autocomplete = "off", autocomplete = "nouveau-mot de passe", ... mais rien ne l'a résolu avec les récents navigateur.

Pour me débarrasser du mot de passe, souvenez-vous, j'ai finalement traité le mot de passe comme un champ de saisie et "flouté" le texte tapé.

Il est moins «sûr» qu'un champ de mot de passe natif car la sélection du texte tapé l'afficherait en texte clair, mais le mot de passe n'est pas mémorisé. Cela dépend également de l'activation de Javascript.

Vous aurez une estimation du risque d'utilisation de l'option de proposition ci-dessous par rapport au mot de passe du navigateur.

Bien que la mémorisation des mots de passe puisse être gérée (déséquilibrée par site) par l'utilisateur, c'est bien pour un ordinateur personnel, pas pour un ordinateur "public" ou partagé.

Dans mon cas, c'est pour un ERP fonctionnant sur des ordinateurs partagés, je vais donc essayer ma solution ci-dessous.

<input style="background-color: rgb(239, 179, 196); color: black; text-shadow: none;" name="password" size="10" maxlength="30" onfocus="this.value='';this.style.color='black'; this.style.textShadow='none';" onkeypress="this.style.color='transparent'; this.style.textShadow='1px 1px 6px green';" autocomplete="off" type="text">
Cedric Simon
la source
1

Markus a soulevé un grand point. J'ai décidé de rechercher l' autocompleteattribut et j'ai obtenu ce qui suit:

Le seul inconvénient de l'utilisation de cet attribut est qu'il n'est pas standard (il fonctionne dans les navigateurs IE et Mozilla) et entraînerait l'échec de la validation XHTML. Je pense que c'est un cas où il est raisonnable de rompre la validation cependant. ( source )

Je dois donc dire que même si cela ne fonctionne pas à 100%, il est géré dans les principaux navigateurs, c'est donc une excellente solution.

Joseph Pecoraro
la source
j'ai ce problème de validation selon les normes w3c. Le fait est que je veux cette fonctionnalité pour un site Web de banque mobile. Je suppose que les navigateurs mobiles sont suffisamment stricts et peuvent parfois gâcher le formulaire si un attribut non valide est utilisé. Que recommandez-vous dans ce cas?
asgs
2
Je pense que c'est un ancien style de pensée. De nombreux navigateurs mobiles récents sont construits à partir de WebKit et prennent en charge ou ignorent gracieusement cet attribut. Je ne sais pas comment les autres pays ou les navigateurs des anciens téléphones portables gèrent cela, mais la gestion gracieuse des attributs / éléments qui ne sont pas connus est fondamentale pour un bon navigateur. Il «protège le futur» du navigateur pour qu'il ne se casse pas à mesure que le Web évolue. Il peut prendre du retard (ne pas implémenter de nouvelles fonctionnalités) mais il ne se cassera pas. J'espère que ça aide =)
Joseph Pecoraro
1
Ce devrait être plutôt un commentaire à la réponse renvoyée qu'une réponse à la question elle-même.
viam0Zah
1

J'ai essayé dessus autocomplete="off"et pourtant tout a réussi. si vous utilisez js angulaire, ma recommandation est d'aller avec le bouton et le ng-click.

<button type="button" class="" ng-click="vm.login()" />

Cela a déjà une réponse acceptée im ajoutant ceci si quelqu'un ne peut pas résoudre le problème avec la réponse acceptée, il peut aller avec mon mécanisme.

Merci pour la question et les réponses.

Lasitha Benaragama
la source
cela casse évidemment en appuyant sur la touche enterou returnpour soumettre un formulaire.
8eecf0d2
0

Une façon que je sais est d'utiliser (par exemple) JavaScript pour copier la valeur du champ de mot de passe avant de soumettre le formulaire.

Le principal problème est que la solution est liée à JavaScript.

Là encore, s'il peut être lié à JavaScript, vous pouvez aussi hacher le mot de passe côté client avant d'envoyer une demande au serveur.

Huppie
la source
Le hachage côté client ne remplace pas le hachage côté serveur. Je ne sais pas si c'est une aide du tout (si cela est fait en plus).
Brilliand
2
Autoriser le hachage côté client est dangereux car cela signifie qu'un attaquant n'a pas besoin de casser le mot de passe du hachage, il peut simplement utiliser le hachage pour se connecter. Le hachage devient équivalent au mot de passe.
rjmunro
Je suis d'accord avec Brilliand que le hachage sur le client n'est utile que si vous avez également un hachage sur le serveur avant d'enregistrer le mot de passe dans votre base de données. Cependant, avoir un hachage côté client peut aider à résoudre certains problèmes avec les hommes au milieu. Cela étant dit, puisque le code sera disponible (au moins sur les sites publics) pour les pirates, il n'est probablement pas aussi utile qu'il y paraît.
Alexis Wilke
0

Le vrai problème est beaucoup plus profond que l'ajout d'attributs à votre code HTML - c'est un problème de sécurité commun, c'est pourquoi les gens ont inventé des clés matérielles et d'autres choses folles pour la sécurité.

Imaginez que la saisie semi-automatique = "off" fonctionne parfaitement dans tous les navigateurs. Est-ce que cela aiderait à la sécurité? Bien sûr que non. Les utilisateurs noteront leurs mots de passe dans des manuels, sur des autocollants attachés à leur moniteur où chaque visiteur du bureau peut les voir, les enregistrer dans des fichiers texte sur le bureau, etc.

En règle générale, l'application Web et le développeur Web ne sont en aucun cas responsables de la sécurité de l'utilisateur final. Les utilisateurs finaux ne peuvent se protéger que. Idéalement, ils DOIVENT garder tous les mots de passe dans leur tête et utiliser la fonctionnalité de réinitialisation du mot de passe (ou contacter l'administrateur) au cas où ils l'oublieraient. Sinon, il y aura toujours un risque que le mot de passe soit visible et volé.

Donc, soit vous avez une politique de sécurité folle avec des clés matérielles (comme certaines banques proposent des services bancaires sur Internet qui utilisent essentiellement une authentification à deux facteurs), soit AUCUNE SÉCURITÉ en gros. Eh bien, c'est un peu exagéré bien sûr. Il est important de comprendre contre quoi essayez-vous de vous protéger:

  1. Accès non autorisé. Le formulaire de connexion le plus simple suffit essentiellement. Il y a parfois des mesures supplémentaires prises comme des questions de sécurité aléatoires, des CAPTCHA, le renforcement des mots de passe, etc.
  2. Reniflage d'informations d'identification. HTTPS est un MUST si les gens accèdent à votre application Web à partir de points d'accès Wi-Fi publics, etc.
  3. Attaque d'initié. Il existe deux exemples de ce type, à partir du simple vol de vos mots de passe dans le navigateur ou de ceux que vous avez écrits quelque part sur le bureau (ne nécessite aucune compétence informatique) et se terminant par la création de session et l'interception du trafic réseau local (même crypté) et d'accéder à une application Web comme s'il s'agissait d'un autre utilisateur final.

Dans ce post, je peux voir des exigences inadéquates imposées au développeur qu'il ne pourra jamais résoudre en raison de la nature du problème - la sécurité de l'utilisateur final. Mon point de vue subjectif est que le développeur devrait essentiellement dire NON et pointer sur le problème des exigences plutôt que de perdre du temps sur de telles tâches, honnêtement. Cela ne rend pas absolument votre système plus sûr, cela conduira plutôt aux étuis avec des autocollants sur les moniteurs. Malheureusement, certains patrons n'entendent que ce qu'ils veulent entendre. Cependant, si j'étais vous, j'essaierais d'expliquer d'où vient le problème réel, et cette autocomplete = "off" ne le résoudrait que si elle obligeait les utilisateurs à garder tous leurs mots de passe exclusivement dans leur tête! Le développeur de son côté ne peut pas protéger complètement les utilisateurs,

ruruskyi
la source
0

Face au même problème HIPAA et trouvé une solution relativement simple,

  1. Créez un champ de mot de passe masqué avec le nom du champ sous forme de tableau.

    <input type="password" name="password[]" style="display:none" />
    
  2. Utilisez le même tableau pour le champ de mot de passe réel.

    <input type="password" name="password[]" />
    

Le navigateur (Chrome) peut vous inviter à "Enregistrer le mot de passe", mais peu importe si l'utilisateur sélectionne enregistrer, la prochaine fois qu'il se connectera, le mot de passe remplira automatiquement le champ de mot de passe caché, l'emplacement zéro dans la baie, en laissant le 1er emplacement vide.

J'ai essayé de définir le tableau, tel que "mot de passe [part2]", mais il s'en souvenait toujours. Je pense qu'il le jette s'il s'agit d'un tableau non indexé car il n'a pas d'autre choix que de le déposer au premier endroit.

Ensuite, vous utilisez votre langage de programmation de choix pour accéder au tableau, PHP par exemple,

echo $_POST['password'][1];
Mike
la source
1
Avec cela, vous cachez un problème de sécurité - le hachage du mot de passe est toujours stocké dans le cache du navigateur.
Alexander Burakevych
1
Pourriez-vous clarifier? Le mot de passe serait envoyé en texte brut à l'aide de POST. Pour autant que j'ai lu, les demandes POST ne peuvent pas être mises en cache. Êtes-vous en train de dire qu'il existe une alternative à l'utilisation de POST pour envoyer des données? Ou dites-vous que le mot de passe est stocké dans le navigateur, car il ne stocke pas le mot de passe mais la valeur vide au début du tableau, avez-vous testé cette méthode?
Mike
0

Comme la plupart des autocompletesuggestions, y compris la réponse acceptée, ne fonctionnent pas dans les navigateurs web d'aujourd'hui (gestionnaires de mot de passe du navigateur web -à- dire ignorer autocomplete), une solution plus originale est d'échanger entre passwordettext types et faire correspondre la couleur de fond la couleur du texte lorsque le champ est un champ de texte brut, qui continue de masquer le mot de passe tout en étant un véritable champ de mot de passe lorsque l'utilisateur (ou un programme comme KeePass) entre un mot de passe. Les navigateurs ne demandent pas d'enregistrer les mots de passe stockés dans des champs de texte brut.

L'avantage de cette approche est qu'elle permet une amélioration progressive et ne nécessite donc pas Javascript pour qu'un champ fonctionne comme un champ de mot de passe normal (vous pouvez également commencer par un champ de texte brut à la place et appliquer la même approche, mais ce n'est pas vraiment HIPAA Conforme PHI / PII). Cette approche ne dépend pas non plus de formulaires / champs cachés qui ne sont pas nécessairement envoyés au serveur (car ils sont masqués) et certaines de ces astuces ne fonctionnent pas non plus dans plusieurs navigateurs modernes.

Plugin jQuery:

https://github.com/cubiclesoft/php-flexforms-modules/blob/master/password-manager/jquery.stoppasswordmanager.js

Code source pertinent à partir du lien ci-dessus:

(function($) {
$.fn.StopPasswordManager = function() {
    return this.each(function() {
        var $this = $(this);

        $this.addClass('no-print');
        $this.attr('data-background-color', $this.css('background-color'));
        $this.css('background-color', $this.css('color'));
        $this.attr('type', 'text');
        $this.attr('autocomplete', 'off');

        $this.focus(function() {
            $this.attr('type', 'password');
            $this.css('background-color', $this.attr('data-background-color'));
        });

        $this.blur(function() {
            $this.css('background-color', $this.css('color'));
            $this.attr('type', 'text');
            $this[0].selectionStart = $this[0].selectionEnd;
        });

        $this.on('keydown', function(e) {
            if (e.keyCode == 13)
            {
                $this.css('background-color', $this.css('color'));
                $this.attr('type', 'text');
                $this[0].selectionStart = $this[0].selectionEnd;
            }
        });
    });
}
}(jQuery));

Démo:

https://barebonescms.com/demos/admin_pack/admin.php

Cliquez sur "Ajouter une entrée" dans le menu, puis faites défiler vers le bas de la page jusqu'à "Module: Stop Password Manager".

Avertissement: Bien que cette approche fonctionne pour les personnes voyantes, il peut y avoir des problèmes avec le logiciel de lecture d'écran. Par exemple, un lecteur d'écran peut lire à haute voix le mot de passe de l'utilisateur car il voit un champ de texte en clair. L'utilisation du plug-in ci-dessus peut également entraîner d'autres conséquences imprévues. La modification de la fonctionnalité de navigateur Web intégrée doit être effectuée avec parcimonie en testant une grande variété de conditions et de cas marginaux.

CubicleSoft
la source
-1

Existe-t-il un moyen pour un site de dire au navigateur de ne pas proposer de se souvenir des mots de passe?

Le site Web indique au navigateur qu'il s'agit d'un mot de passe en utilisant <input type="password">. Donc, si vous devez le faire du point de vue d'un site Web, vous devrez changer cela. (Évidemment, je ne le recommande pas).

La meilleure solution serait que l'utilisateur configure son navigateur pour qu'il ne se souvienne pas des mots de passe.

Joseph Pecoraro
la source
3
Comment est-il évident que vous ne recommandez pas de modifier un champ de type d'entrée? Une élaboration des questions de sécurité serait utile.
Karl
1
@karl: parce qu'avoir à taper le mot de passe en plein air permet un "surf sur l'épaule", le processus de glaner un mot de passe en regardant l'écran pendant sa saisie.
David Schmitt
Non seulement la navigation sur l'épaule humaine, mais les logiciels espions ou les virus peuvent regarder votre écran et voir ce qui a été tapé dans des champs en clair.
Karl
6
@karl: Si vous avez des logiciels espions / virus sur votre ordinateur, aucune protection contre les astérisques ne vous sauvera. Il n'est pas plus difficile pour une application installée d'intercepter ce qui est saisi dans un champ «mot de passe» que de faire de même pour un champ en texte brut.
Markus Olsson du
3
De plus, si le navigateur voit une entrée de texte régulière au lieu d'une entrée de mot de passe, il est probable qu'il cache le mot de passe sous la forme base de données de saisie semi-automatique au lieu de la base de données de mots de passe ... puis le suggère ou même le remplisse automatiquement sur un site Web non lié! Votre situation est donc encore pire que lorsque vous avez commencé.
zwol
-1

Si vous ne souhaitez pas faire confiance à l'indicateur de saisie semi-automatique, vous pouvez vous assurer que l'utilisateur tape dans la zone à l'aide de l'événement onchange. Le code ci-dessous est un simple formulaire HTML. L'élément de formulaire masqué password_edited commence défini sur 0. Lorsque la valeur du mot de passe est modifiée, le JavaScript en haut (fonction pw_edited) change la valeur à 1. Lorsque le bouton est enfoncé, il vérifie le code de valeur ici avant de soumettre le formulaire . De cette façon, même si le navigateur vous ignore et complète automatiquement le champ, l'utilisateur ne peut pas passer la page de connexion sans saisir le mot de passe. Assurez-vous également de vider le champ du mot de passe lorsque la mise au point est définie. Sinon, vous pouvez ajouter un caractère à la fin, puis revenir en arrière et le supprimer pour tromper le système. Je recommande également d'ajouter l'autocomplete = "off" au mot de passe, mais cet exemple montre comment fonctionne le code de sauvegarde.

<html>
  <head>
    <script>
      function pw_edited() {
        document.this_form.password_edited.value = 1;
      }
      function pw_blank() {
        document.this_form.password.value = "";
      }
      function submitf() {
        if(document.this_form.password_edited.value < 1) {
          alert("Please Enter Your Password!");
        }
        else {
         document.this_form.submit();
        }
      }
    </script>
  </head>
  <body>
    <form name="this_form" method="post" action="../../cgi-bin/yourscript.cgi?login">
      <div style="padding-left:25px;">
        <p>
          <label>User:</label>
          <input name="user_name" type="text" class="input" value="" size="30" maxlength="60">
        </p>
        <p>
          <label>Password:</label>
          <input name="password" type="password" class="input" size="20" value="" maxlength="50" onfocus="pw_blank();" onchange="pw_edited();">
        </p>
        <p>
          <span id="error_msg"></span>
        </p>
        <p>
          <input type="hidden" name="password_edited" value="0">
          <input name="submitform" type="button" class="button" value="Login" onclick="return submitf();">
        </p>
      </div>
    </form>
  </body>
</html>
À M
la source
-1

autocomplete = "off" ne fonctionne pas pour désactiver le gestionnaire de mots de passe dans Firefox 31 et très probablement pas dans certaines versions antérieures.

Consultez la discussion sur mozilla à propos de ce problème: https://bugzilla.mozilla.org/show_bug.cgi?id=956906

Nous voulions utiliser un deuxième champ de mot de passe pour entrer un mot de passe à usage unique généré par un jeton. Maintenant, nous utilisons une entrée de texte au lieu d'une entrée de mot de passe. :-(

Andreas Stankewitz
la source
-1

On m'a donné une tâche similaire pour désactiver le remplissage automatique du nom de connexion et des mots de passe par le navigateur, après beaucoup d'essais et d'erreurs, j'ai trouvé la solution ci-dessous optimale. Ajoutez simplement les contrôles ci-dessous avant vos contrôles d'origine.

<input type="text" style="display:none">
<input type="text" name="OriginalLoginTextBox">

<input type="password" style="display:none">
<input type="text" name="OriginalPasswordTextBox">

Cela fonctionne bien pour IE11 et Chrome 44.0.2403.107

Sheiky
la source
-2

autocomplete = "off" fonctionne pour la plupart des navigateurs modernes, mais une autre méthode que j'ai utilisée et qui a fonctionné avec succès avec Epiphany (un navigateur WebKit pour GNOME) consiste à stocker un préfixe généré aléatoirement en état de session (ou un champ caché, je me trouvais avoir une variable appropriée dans l'état de session déjà), et utilisez-la pour modifier le nom des champs. Epiphany veut toujours enregistrer le mot de passe, mais en revenant au formulaire, il ne remplira pas les champs.

Peter Nelson
la source
C'est encore pire que de les stocker de la manière habituelle, car maintenant l'utilisateur ne voit pas que le mot de passe a été enregistré sans empêcher un attaquant d'extraire le mot de passe du magasin.
CodesInChaos
-2

Je n'ai eu aucun problème en utilisant cette méthode:

Utilisez autocomplete = "off", ajoutez un champ de mot de passe caché puis un autre non caché. Le navigateur essaie de compléter automatiquement celui caché s'il ne respecte pas autocomplete = "off"

Spechal
la source
-2

Une autre solution consiste à faire le POST en utilisant un formulaire caché où toutes les entrées sont de type caché. Le formulaire visible utilisera une entrée de type "mot de passe". Ce dernier formulaire ne sera jamais soumis et le navigateur ne peut donc pas intercepter du tout l'opération de connexion.

Seigneur de la Goo
la source