Błąd „Pole hasła jest puste” podczas korzystania z autouzupełniania w Chrome

10

Kiedy otwieram ekran logowania w przeglądarce Chrome, przeglądarka automatycznie wypełnia formularz moją nazwą użytkownika i hasłem. Jednak po naciśnięciu przycisku wysyłania pojawia się następujący komunikat:

BŁĄD: pole hasła jest puste.

Dodanie spacji do automatycznie wypełnianego hasła i usunięcie go ponownie pozwala mi się zalogować. Co się dzieje?

Robbert
źródło

Odpowiedzi:

15

Przyczyną wp_attempt_focustego problemu jest funkcja JavaScript . Funkcja jest uruchamiana wkrótce po załadowaniu strony, usuwa formularz i skupia się na nim, zmuszając użytkowników do ręcznego wprowadzania danych logowania.

Chrome automatycznie wpisuje nazwę użytkownika i hasło, zaledwie milisekundy, zanim funkcja JS wyczyści pole. Chrome nieprawidłowo odbiera zmiany, wyświetlając wypełnione pola w kolorze żółtym, mimo że pola są faktycznie puste.

Chociaż doceniam funkcję autofokusa, nie mogę znaleźć dobrego powodu, dla którego ktoś chciałby, aby formularz był automatycznie czyszczony.

Źródło

Niestety, funkcja została zakodowana na stałe wp-login.phpw liniach 913-930 (WordPress 4.0). Zmiana wp-login.phppliku jest złym pomysłem, ponieważ można go zastąpić w każdej nadchodzącej aktualizacji WordPress. Będziemy musieli więc zastosować trochę „hakowania”.

Łatwa naprawa

wp_attempt_focusFunkcja jest wywoływana, jeśli formularz nie ma błędów. Mamy szczęście - sprawdzanie błędów odbywa się za pośrednictwem PHP. Oznacza to, że możemy po prostu uniemożliwić uruchomienie funkcji przez sfałszowanie błędu formularza we właściwym czasie za pomocą akcji WP. Wybrałem login_formakcję, ponieważ akcja zawsze uruchamia się po obsłudze błędów, tuż przed wywołaniem JS. Dodaj następujący kod do motywu functions.php(lub pliku wtyczki):

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

Hackish fix

Powyższa poprawka zapobiega całkowitemu odpaleniu funkcji, co oznacza, że ​​nie uzyskasz również odpowiedniego autofokusa. Jest na to inny sposób: buforowanie danych wyjściowych HTML i modyfikowanie ich ob_start, inspirowane przez Geeklab . Buforowanie pozwala nam usunąć określone fragmenty kodu - w tym przypadku część automatycznego czyszczenia d.value = ''. Nie zapomnij jednak opróżnić bufora.

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
źródło
2
Wybitny. Naprawić to należy zastosować do rdzenia. Otrzymałem wiele komentarzy od użytkowników, którzy mają z tym problemy. Dziękujemy za udostępnienie poprawki.
Christine Cooper
Dziękuję za rozwiązanie. Pomyśl też, że nie powinno to być sednem.
ThiagoPonte,
0

Też miałem ten problem. Wyłączyłem wtyczkę „WP-SpamShield” autorstwa Scotta Allena i wszystko znów zaczęło działać.

ERM
źródło
0

Moje hasło było puste / puste, więc próbowałem zmienić je na coś innego, na przykład „1234”. Dodanie miejsca i usunięcie go nie działało, podobnie jak wyłączenie JS. Wypróbowałem też inną przeglądarkę, więc czy to naprawdę tylko w Chrome?

Zrobiłem to, że zmieniłem hash hasła w bazie danych i zadziałało. wp_users.user_pass.

w moim przypadku hasło 1234jest takie jak BCrypted:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

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

wizerunek

P_95
źródło