it-swarm.com.de

Woher weiß der Browser, wann er den Benutzer auffordert, das Passwort zu speichern?

Dies hängt mit der Frage zusammen, die ich hier gestellt habe: Wie kann ich den Browser dazu bringen, das Kennwort zu speichern?

Dies ist das Problem: Ich kann meinen Browser NICHT dazu bringen, das Kennwort für die von mir entwickelte Website zu speichern. (Ich spreche von der Leiste, die manchmal angezeigt wird, wenn Sie ein Formular bei Firefox absenden, das "Erinnern Sie sich an das Passwort für yoursite.com? Ja/Nicht jetzt/Nie").

Dies ist sehr frustrierend, da diese Funktion von Firefox (und den meisten anderen modernen Browsern, die hoffentlich ähnlich funktionieren) ein Rätsel zu sein scheint. Es ist wie ein Zaubertrick, den der Browser anstellt, wo er Ihren Code ansieht oder was Sie einreichen oder etwas. Wenn er wie ein Anmeldeformular mit einem Feld für Benutzernamen (oder E-Mail-Adresse) und einem Kennwortfeld aussieht, bietet es an speichern.

Außer in diesem Fall, in dem meinen Benutzern diese Option nicht angeboten wird, nachdem sie mein Anmeldeformular verwendet haben, und es macht mich verrückt. :-)

(Ich habe meine Firefox-Einstellungen überprüft - Ich habe dem Browser NICHT "nie" für diese Site mitgeteilt. Es sollte eine Aufforderung sein.)

Meine Frage

Welche Heuristiken verwendet Firefox, um zu wissen, wann der Benutzer zum Speichern auffordert? Es sollte nicht zu schwierig sein, dies zu beantworten, da es direkt in der Mozilla-Quelle steht (ich weiß nicht, wo ich suchen muss, sonst würde ich versuchen, es selbst herauszufinden). Ich hatte auch kein Glück, einen Blogbeitrag oder eine ähnliche ähnliche Anmerkung der Entwickler von Mozilla zu diesem Thema zu finden.

(Es wäre gut, wenn diese Frage für Safari oder IE beantwortet würde; ich könnte mir vorstellen, dass alle Browserbenutzer sehr ähnliche Regeln haben. Wenn ich es also in einem von ihnen zum Laufen bringen kann, wird es in den anderen funktionieren.)

(* Beachten Sie, dass, wenn Ihre Antwort an mich etwas mit Cookies, Verschlüsselung oder irgendetwas zu tun hat, wie ich Passwörter in meiner lokalen Datenbank abspeichere, die Wahrscheinlichkeit groß ist, dass Sie meine Frage falsch verstanden haben. :-)

78
Eric

Basierend auf dem, was ich gelesen habe, denke ich, dass Firefox Passwörter anhand von form.elements[n].type == "password" (durch alle Formularelemente durchläuft) ermittelt, und dann das Feld "Benutzername" ermittelt, indem Sie die Formularelemente unmittelbar vor dem Passwortfeld rückwärts durch das Textfeld durchsuchen (mehr Info hier ). Sie können etwas Ähnliches in Javascript versuchen und sehen, ob Sie Ihr Kennwortfeld erkennen können.

Soweit ich das beurteilen kann, muss Ihr Anmeldeformular Teil eines <form> sein, ansonsten wird es von Firefox nicht erkannt. Das Setzen von id="password" in Ihrem Kennwortfeld kann wahrscheinlich auch nicht schaden.

Wenn dies nach wie vor viele Probleme aufwirft, würde ich empfehlen, sich an eine der Entwickler-Mailinglisten des Mozilla-Projekts zu wenden (möglicherweise erhalten Sie sogar eine Antwort vom Entwickler, der die Funktion entworfen hat).

51
bta

Ich hatte das gleiche Problem und fand eine Lösung: 

  1. damit der Browser das Kennwort abspeichert, müssen die Felder Benutzername und Kennwort in einem Formular vorhanden sein und dieses Formular muss tatsächlich übermittelt werden. Der Submit-Button könnte vom onclick-Handler den Wert false zurückgeben (das Submit findet also nicht statt).

  2. damit der Browser das zuvor gespeicherte Kennwort wiederherstellen kann, müssen die Eingabefelder im HTML-Hauptformular vorhanden sein und nicht dynamisch durch Javascript erstellt werden. Das Formular kann mit Anzeige erstellt werden: keine.

Es ist zu beachten, dass das Passwort sofort nach dem Laden der Seite ausgefüllt wird und dort während der gesamten Sitzung vorhanden ist, sodass es von injiziertem Javascript gelesen werden kann: Es macht solche Angriffe noch viel schlimmer. Um dies zu vermeiden, ist das Weiterleiten auf eine separate Seite nur zum Anmelden sinnvoll und löst alle Probleme, für die Sie dieses Thema gelesen haben :). Als Teillösung lösche ich die Felder beim Senden des Formulars. Wenn sich der Benutzer abmeldet und sich erneut anmelden möchte, wird das Kennwort nicht vom Browser ausgefüllt, aber das ist für mich unbedeutend.

Viliam


17
user324356

Sie sollten sich die Seite Mozilla Password Manager Debugging und die nsILoginManager docs für Erweiterungsautoren ansehen (nur für die wichtigsten technischen Details, wie Firefox die Kennwortverwaltung behandelt). Sie können in die dortigen Antworten und auf andere dort verlinkte Seiten eingreifen, um mehr zu erfahren, als Sie wahrscheinlich jemals wissen wollten, wie der Passwort-Manager mit Sites und Erweiterungen interagiert.

(Insbesondere wie im Debugging-Dokument des Kennwort-Managers angegeben, stellen Sie sicher, dass die automatische Vervollständigung in Ihrer HTML-Datei nicht deaktiviert ist, da dadurch die Aufforderung zum Speichern des Benutzernamens und des Kennworts unterdrückt wird.)

10
Nick Bastin

Dies scheint für Firefox, Chrome und Safari auf dem Mac zu funktionieren. Nicht unter Windows getestet. 

<form id="bridgeForm" action="#" target="loginframe" autocomplete="on">
    <input type="text" name="username" id="username" />
    <input type="password" name="password" id="password"/>
</form>

<iframe id="loginframe" name="loginframe" src="anyblankpage.html"></iframe>

Dies muss der Seite hinzugefügt werden. Es kann nicht dynamisch hinzugefügt werden. Das Formular und der iframe können so eingestellt werden, dass sie angezeigt werden: none. Wenn Sie die src des iframe nicht festlegen, wird die Eingabeaufforderung erst angezeigt, wenn Sie das Formular mindestens einmal gesendet haben. 

Dann rufen Sie das Formular submit () auf:

bridgeForm.submit();

Die Aktion kann optional sein und die automatische Vervollständigung kann optional sein. Nicht getestet 

Hinweis : Bei einigen Browsern muss das Formular auf einem Server (nicht localhost und nicht dem Dateisystem) ausgeführt werden, bevor der Browser antwortet. 

Also das:

http://www.mysite.com/myPage.html 

nicht das: 

http://126.0.0.1/myPage.html
http://localhost/myPage.html
file://directory/myPage.html

6
1.21 gigawatts

Funktioniert bei mir mit Winkel, Chrom, Firefox: (Ich habe stundenlang gesucht und getestet - für Chrom war der Formularaktionsparameter (#) die Antwort. @ 1,21 Gigawatt , danke !!! Deine Antwort war von unschätzbarem Wert.)

bilden

firefox 30.0 - benötigt keinen ausgeblendeten iframe- und Submit-Button (wie unten gezeigt), benötigt jedoch die Direktive "login-form-autofill-fix" zum Erkennen der automatisch ausgefüllten Berechtigungsnachweise:

<form name="loginForm" login-form-autofill-fix action="#" target="emptyPageForLogin" method="post" ng-submit="login({loginName:grpEmail,password:grpPassword})">
<input type="text" name=username" id="username" ng-model="grpEmail"/>
<input type="password" name="password" id="password" ng-model="grpPassword"/>
<button type="submit">Login</button>
</form>

versteckter iframe

chrome 35.0 - benötigt die obige Direktive nicht, benötigt aber einen versteckten Iframe und einen Senden-Button im realen Formular. Der versteckte Iframe sieht aus wie

<iframe src="emptyPageForLogin.html" id="emptyPageForLogin" name="emptyPageForLogin" style="display:none"></iframe>

winkeldirektive (mit jqLite)

Dies funktioniert mit Winkel 1.2.18

module.directive('loginFormAutofillFix', function() { 
            return function(scope, elem, attrs) {
        if(!attrs.ngSubmit) {
            return;
        }
        setTimeout(function() {
            elem.unbind("submit").bind("submit", function(e) {
                //DO NOT PREVENT!  e.preventDefault(); 
                elem.find("input").triggerHandler("input");
                scope.$apply(attrs.ngSubmit);
            });
        }, 0);
});

Änderung

  • nach einigem Testen stellte ich fest, dass Chrome durch die winklige Anmeldemethode (200ms) etwas Zeit benötigt - die Weiterleitung ist für den Kennwort-Manager manchmal zu schnell.
  • besser klarer Browsercache ... bei jeder Änderung
5
110maor

Mir ist auch aufgefallen, dass Chrome kein Kennwort anbietet, wenn das Anmeldeformular nach der Anmeldeanforderung noch vorhanden ist, selbst wenn es auf der Seite ausgeblendet ist.

Ich denke, dass die Login-Aktion fehlgeschlagen ist, und weigert sich daher, ungültige Anmeldeinformationen zu speichern.

Gesehen auf Chrome 34.0.

3
ZeWaren

Nun, auf unserer Site scheint ein Formularfeld mit dem Namen "Benutzername" Typ "Text" unmittelbar gefolgt von einem Feld mit dem Namen "Passwort" und dem Typ "Passwort" den Trick zu haben.

3
spender

Wenn Sie AJAX verwenden, werfen Sie einen Blick auf diesen Quellcode: https://Gist.github.com/968927

Es besteht aus dem Senden eines Anmeldeformulars an einen verborgenen Iframe, sodass IE und Chrome die tatsächliche Anmeldung erkennen können, ohne die Seite neu laden zu müssen.

3
Adrien Joly

Ich würde empfehlen, den Firefox-Quellcode anzusehen. Es ist eigentlich ziemlich einfacher Code.

Die Methoden, die Sie betrachten möchten, sind _onFormSubmit, _getFormFields und _getPasswordFields

Sie können sogar feststellen, dass das Problem, das Sie haben, einen unbekannten Fehler in Firefox darstellt;) https://bugzilla.mozilla.org/show_bug.cgi?id=1211780

3
WoodenKitty

Die Heuristiken sind hier ziemlich einfach: Erkennen Sie Felder mit bestimmten Namen in einer bestimmten Reihenfolge. Welche kann ich nicht sagen, aber das hat für mich in Chrome und IE gut funktioniert:

Username field: name "login", type "text";
Password field: name "password", type "password"
Submit button: element "input", type "submit". 
Element "button" type "submit" did not work.
2
user19878

Wenn Sie z. B. zwei type = text in Ihrem Formular vor der Eingabe type = password haben, ermittelt der Browser ____ den nächsten Eingabetyp = text für Ihren Benutzernamen.

Dies ist nicht gleichbedeutend mit einer anderen Eingabe = Benutzername und Name = Benutzername

um dieses Problem zu lösen, müssen Sie Ihren Benutzernamen eingeben, den Sie genau vor Ihrem Eingabepasswort speichern möchten

Viel Glück :-)

1
keivan kashani

Neben vielem, was bereits gesagt wurde, habe ich festgestellt, dass die Eingabefelder nicht "deaktiviert" werden dürfen. Wir hatten ein mehrstufiges Login, das zuerst nach dem Benutzernamen und dann auf dem nächsten Bildschirm nach dem Passwort fragt. Auf diesem zweiten Bildschirm haben wir die E-Mail wiederholt, sie jedoch deaktiviert und Chrome et. al. als gültiges Feld für den Benutzernamen zu erkennen.

Da wir dieses deaktivierte Eingabefeld wirklich behalten wollten, endeten wir mit dieser hacky Workaround:

<input type="text" name="display-username" id="display-username" value="ENTERED_USERNAME" placeholder="Username" disabled="disabled">
<input type="text" name="username" id="username" value="ENTERED_USERNAME" placeholder="Username" style="display: none;">
<input type="password" name="password" id="password" value="" autofocus="autofocus" autocomplete="on" placeholder="Password" required="required">

Ich würde nicht so weit gehen, das zu empfehlen, aber vielleicht weist es jemanden auf etwas in seinem eigenen Code hin:

  1. Das erste Element zeigt den Benutzernamen in einem deaktivierten Eingabefeld an. Deaktiviert wird nicht als Teil des Formulars übermittelt, und Deaktiviert wird vom Browser nicht erkannt.
  2. Das zweite Element ist ein richtiges Eingabefeld mit type = "text" und name/id = "username". Dies wird vom Browser erkannt. Um zu verhindern, dass der Benutzer sie bearbeitet, verbergen wir sie mit CSS (Anzeige: keine).
0
hendrikbeck