it-swarm.com.de

Gibt es eine gültige W3C-Methode zum Deaktivieren der automatischen Vervollständigung in einem HTML-Formular?

Bei Verwendung des xhtml1-transitional.dtd doctype, sammelt eine Kreditkartennummer mit dem folgenden HTML

<input type="text" id="cardNumber" name="cardNumber" autocomplete='off'/>

kennzeichnet eine Warnung auf dem W3C-Validator:

es gibt kein Attribut "Autocomplete".

Gibt es eine W3C/Standards-Möglichkeit, die automatische Vervollständigung des Browsers für sensible Felder in einem Formular zu deaktivieren?

418
matt b

Hier ist ein guter Artikel aus dem MDC, der die Probleme (und Lösungen) für die automatische Vervollständigung erklärt. Microsoft hat auch etwas Ähnliches veröffentlicht hier .

Um ehrlich zu sein, wenn dies für Ihre Benutzer wichtig ist, erscheint es angemessen, Standards auf diese Weise zu brechen. Beispielsweise verwendet Amazon das Attribut "Autocomplete" ziemlich oft und es scheint gut zu funktionieren.

Wenn Sie die Warnung vollständig entfernen möchten, können Sie das Attribut mit JavaScript auf Browser anwenden, die sie unterstützen (IE und Firefox sind die wichtigen Browser), indem Sie someForm.setAttribute( "autocomplete", "off" ); someFormElm.setAttribute( "autocomplete", "off" ); verwenden.

Wenn Ihre Site HTTPS verwendet, wird die automatische Vervollständigung durch IE) automatisch deaktiviert (so weit ich weiß, auch in einigen anderen Browsern).

Update

Da diese Antwort immer noch einige positive Stimmen hat, wollte ich nur darauf hinweisen, dass Sie in HTML5 das Attribut "Autocomplete" für Ihr Formularelement verwenden können. Siehe dazu die Dokumentation auf W3C.

418
Nick Presta

Ich wäre sehr überrascht, wenn W3C einen Weg vorgeschlagen hätte, der mit (X) HTML4 funktioniert. Die Autocomplete-Funktion ist vollständig browserbasiert und wurde in den letzten Jahren eingeführt (lange nachdem der HTML4-Standard geschrieben wurde).

Wäre nicht überrascht, wenn HTML5 eine haben würde.

Edit: Wie ich dachte, HTML5 hat diese Funktion. Verwenden Sie den folgenden Doctype, um Ihre Seite als HTML5 zu definieren (d. H .: Fügen Sie diesen als ersten Text in Ihren Quellcode ein). Beachten Sie, dass nicht alle Browser diesen Standard unterstützen, da er noch in Entwurfsform vorliegt.

<!DOCTYPE html>
63
Henrik Paul

HTML 4 : Nein

HTML 5 : Ja

Das Autocomplete-Attribut ist ein Aufzählungsattribut. Das Attribut hat zwei Zustände. Das Schlüsselwort on wird dem Status on zugeordnet, und das Schlüsselwort off wird zugeordnet in den Aus-Zustand. Das Attribut kann auch weggelassen werden. Der Standardwert für fehlende Werte ist der Status on . Der Status aus gibt an, dass bei Formularsteuerelementen im Formular der Name des automatisch auszufüllenden Felds standardmäßig auf aus ; Der Status Ein gibt an, dass für Formularsteuerelemente im Formular der Feldname autofill standardmäßig auf "Ein" gesetzt ist.

Referenz: W

56
RuudKok

Nein, aber die automatische Vervollständigung des Browsers wird häufig dadurch ausgelöst, dass das Feld dasselbe name -Attribut aufweist wie die zuvor ausgefüllten Felder. Wenn Sie einen cleveren Weg finden könnten, um einen zufälligen Feldnamen zu erhalten, wäre die automatische Vervollständigung nicht in der Lage, zuvor eingegebene Werte für das Feld abzurufen.

Wenn Sie einem Eingabefeld einen Namen wie "email_<?= randomNumber() ?>" geben und dann das Skript, das diese Datenschleife empfängt, durch die Variablen POST oder GET nach etwas Passendem suchen lassen das Muster "email_[some number] ", könnten Sie dies durchziehen, und dies hätte (praktisch) den Erfolg garantiert, nabhängig vom Browser.

32
Phantom Watson

Nein, ein guter Artikel ist hier in Mozilla Wiki.

Ich würde weiterhin das ungültige attribute verwenden. Ich denke, hier sollte Pragmatismus die Validierung gewinnen.

31
David Waters

Wie wäre es damit, es mit JavaScript einzustellen?

var e = document.getElementById('cardNumber');
e.autocomplete = 'off'; // Maybe should be false

Es ist nicht perfekt, aber Ihr HTML wird gültig sein.

23
Greg

Ich schlage vor, alle 4 Arten von Eingaben zu erfassen:

$('form,input,select,textarea').attr("autocomplete", "off");

Referenz:

19
Malartre

Wenn Sie jQuery verwenden, können Sie Folgendes tun:

$(document).ready(function(){$("input.autocompleteOff").attr("autocomplete","off");});

und verwenden Sie die autocompleteOff-Klasse, wo Sie wollen:

<input type="text" name="fieldName" id="fieldId" class="firstCSSClass otherCSSClass autocompleteOff" />

Wenn Sie möchten, dass ALLE Ihre Eingaben autocomplete=off, das kannst du einfach benutzen:

$(document).ready(function(){$("input").attr("autocomplete","off");});
11
Totoche

autocomplete="off" Dies sollte das Problem für alle modernen Browser beheben.

<form name="form1" id="form1" method="post" autocomplete="off"
   action="http://www.example.com/form.cgi">
  [...]
</form>

In aktuellen Versionen von Gecko-Browsern funktioniert das Autocomplete-Attribut einwandfrei. In früheren Versionen, die auf Netscape 6.2 zurückgingen, funktionierte dies mit Ausnahme von Formularen mit "Adresse" und "Name".

Update

In einigen Fällen schlägt der Browser weiterhin Werte für die automatische Vervollständigung vor, auch wenn das Attribut für die automatische Vervollständigung deaktiviert ist. Dieses unerwartete Verhalten kann für Entwickler ziemlich verwirrend sein. Der Trick, um die automatische Vervollständigung wirklich zu erzwingen, besteht darin, dem Attribut eine zufällige Zeichenfolge zuzuweisen, zum Beispiel:

autocomplete="nope"

Da dieser Zufallswert kein valid one Ist, gibt der Browser auf.

Dokumentation

8
Emilio Gort

Eine andere Möglichkeit - die auch zur Sicherheit beiträgt - besteht darin, das Eingabefeld jedes Mal anders aufzurufen, wenn Sie es anzeigen: genau wie ein Kapitän. Auf diese Weise kann die Sitzung nur die einmalige Eingabe lesen, und die automatische Vervollständigung muss nicht fortgesetzt werden.

Nur ein Punkt zur Frage von rmeador, ob Sie die Browser-Erfahrung beeinträchtigen sollten: Wir entwickeln Contact Management- und CRM-Systeme, und wenn Sie die Daten anderer Personen in ein Formular eingeben, möchten Sie nicht, dass diese ständig Ihre eigenen Daten angeben.

Das funktioniert für unsere Bedürfnisse, aber dann haben wir den Luxus, den Benutzern zu sagen, dass sie einen anständigen Browser haben sollen :)

autocomplete='off' 
8
Enigma Plus

Die Verwendung eines zufälligen Namensattributs funktioniert für mich.

Ich habe das Attribut name beim Senden des Formulars zurückgesetzt, damit Sie beim Senden des Formulars weiterhin über den Namen darauf zugreifen können. (Verwenden des ID-Attributs zum Speichern des Namens)

6
opznhaarlems

Beachten Sie, dass hinsichtlich der Position des Attributs für die automatische Vervollständigung einige Unklarheiten bestehen. Es kann entweder auf das gesamte FORM-Tag oder auf einzelne INPUT-Tags angewendet werden, und dies war vor HTML5 nicht wirklich standardisiert (das erlaubt explizit beideSpeicherorte ). Ältere Dokumente erwähnen vor allem dieses Mozilla-Artikel nur das FORM-Tag. Gleichzeitig suchen einige Sicherheitsscanner nur im INPUT-Tag nach Autocomplete und beschweren sich, wenn es fehlt (auch wenn es im übergeordneten FORMULAR steht). Eine detailliertere Analyse dieses Durcheinanders finden Sie hier: Verwirrung über AUTOCOMPLETE = OFF-Attribute in HTML-Formularen .

5
kravietz

Nicht ideal, aber Sie könnten die ID und den Namen des Textfelds jedes Mal ändern, wenn Sie es rendern - Sie müssten es auch serverseitig verfolgen, damit Sie die Daten herausholen können.

Nicht sicher, ob das funktionieren wird oder nicht, war nur ein Gedanke.

3
Kieron
if (document.getElementsByTagName) {
    var inputElements = document.getElementsByTagName("input");
    for (i=0; inputElements[i]; i++) {
        if (inputElements[i].className && (inputElements[i].className.indexOf("disableAutoComplete") != -1)) {
            inputElements[i].setAttribute("autocomplete","off");
        }
    }
}
2
Jack Tuck

Ich denke, es gibt einen einfacheren Weg. Erstellen Sie eine versteckte Eingabe mit einem zufälligen Namen (über Javascript) und setzen Sie den Benutzernamen darauf. Wiederholen Sie mit dem Passwort. Auf diese Weise weiß Ihr Back-End-Skript genau, wie der entsprechende Feldname lautet, während die automatische Vervollständigung im Dunkeln bleibt.

Ich liege wahrscheinlich falsch, aber es ist nur eine Idee.

2