Fehler "Kennwortfeld ist leer" bei Verwendung der automatischen Ausfüllung in Chrome

10

Wenn ich den Anmeldebildschirm in Chrome öffne, füllt der Browser das Formular automatisch mit meinem Benutzernamen und Passwort aus. Wenn ich jedoch auf die Schaltfläche "Senden" klicke, wird die folgende Meldung angezeigt:

FEHLER: Das Passwortfeld ist leer.

Durch Hinzufügen eines Leerzeichens zum automatisch ausgefüllten Kennwort und erneutes Entfernen kann ich mich anmelden. Was ist los?

Robbert
quelle

Antworten:

15

Die JavaScript-Funktion wp_attempt_focusverursacht dieses Problem. Die Funktion wird kurz nach dem Laden der Seite ausgelöst, löscht das Formular und konzentriert sich darauf. Benutzer müssen ihre Anmeldeinformationen manuell eingeben.

Chrome gibt den Benutzernamen und das Passwort automatisch ein, nur Millisekunden bevor die JS-Funktion das Feld löscht. Chrome nimmt die Änderungen nicht richtig auf und zeigt gelb ausgefüllte Felder an, obwohl die Felder tatsächlich leer sind.

Obwohl ich die Autofokus-Funktionalität schätze, kann ich mir keinen guten Grund vorstellen, warum jemand möchte, dass das Formular automatisch gelöscht wird.

Die Quelle

Leider wurde die Funktion wp-login.phpin den Zeilen 913-930 (WordPress 4.0) fest codiert. Das Ändern der wp-login.phpDatei insgesamt ist eine schlechte Idee, da sie bei jedem kommenden WordPress-Update überschrieben werden kann. Wir müssen also auf ein bisschen "Hacking" zurückgreifen.

Die einfache Lösung

Die wp_attempt_focusFunktion wird aufgerufen, wenn das Formular keine Fehler enthält. Wir haben Glück - die Fehlerprüfung erfolgt über PHP. Dies bedeutet, dass wir einfach verhindern können, dass die Funktion ausgelöst wird, indem wir mithilfe von WP-Aktionen zum richtigen Zeitpunkt einen Formularfehler vortäuschen. Ich habe die login_formAktion ausgewählt, da die Aktion immer nach der Fehlerbehandlung direkt vor dem JS-Aufruf ausgelöst wird. Fügen Sie dem Thema functions.php(oder der Plugin-Datei) den folgenden Code hinzu :

add_action("login_form", "kill_wp_attempt_focus");
function kill_wp_attempt_focus() {
    global $error;
    $error = TRUE;
}

Die hackige Lösung

Die obige Korrektur verhindert, dass die Funktion vollständig ausgelöst wird, was bedeutet, dass Sie auch keinen richtigen Autofokus erhalten. Es gibt noch einen anderen Weg: die HTML-Ausgabe zu puffern und über zu ändernob_start , wie von Geeklab inspiriert . Durch das Puffern können wir bestimmte Teile des Codes entfernen - in diesem Fall den Autoclear-Teil d.value = ''. Vergessen Sie jedoch nicht, den Puffer zu leeren.

add_action("login_form", "kill_wp_attempt_focus_start");
function kill_wp_attempt_focus_start() {
    ob_start("kill_wp_attempt_focus_replace");
}

function kill_wp_attempt_focus_replace($html) {
    return preg_replace("/d.value = '';/", "", $html);
}

add_action("login_footer", "kill_wp_attempt_focus_end");
function kill_wp_attempt_focus_end() {
    ob_end_flush();
}
Robbert
quelle
2
Hervorragend. Ein Fix dafür sollte auf den Kern angewendet werden. Ich habe viele Kommentare von Benutzern erhalten, die Probleme damit haben. Vielen Dank für das Teilen des Fixes.
Christine Cooper
Vielen Dank für die Lösung. Denken Sie auch, dass dies nicht im Kern sein sollte.
ThiagoPonte
0

Ich hatte auch dieses Problem. Das Plugin "WP-SpamShield" von Scott Allen wurde ausgeschaltet und alles begann wieder zu funktionieren.

ERM
quelle
0

Mein Passwort war nur leer / null, also habe ich versucht, es in etwas anderes zu ändern, wie "1234". Das Hinzufügen und Entfernen des Speicherplatzes funktionierte nicht und das Deaktivieren von JS funktionierte nicht. Habe auch einen anderen Browser ausprobiert, also ist es wirklich nur in Chrome?

Was ich getan habe war, dass ich den Passwort-Hash in der Datenbank geändert habe und es funktioniert hat. wp_users.user_pass.

In meinem Fall 1234lautet das Passwort BCrypted:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

http://bcrypthashgenerator.apphb.com/?PlainText=1234

Bild

P_95
quelle