Помилка "Поле пароля порожнє" під час використання автозаповнення в Chrome


10

Коли я відкриваю екран входу в Chrome, браузер автоматично заповнює форму моїм іменем користувача та паролем. Однак, коли натискаю кнопку надсилання, я отримую таке повідомлення:

ПОМИЛКА: Поле пароля порожнє.

Додавання пробілу до заповненого пароля та видалення його знову дозволяє мені увійти. Що відбувається?

Відповіді:


15

Функція JavaScript wp_attempt_focusвикликає цю проблему. Функція спрацьовує незабаром після завантаження сторінки, очищає форму та фокусується на ній, змушуючи користувачів вручну вводити свої дані для входу.

Chrome заповнює ім’я користувача та пароль автоматично, лише за кілька мілісекунд до того, як функція JS очистить поле. Chrome належним чином не сприймає зміни, показуючи заповнені жовтим кольором поля, навіть якщо поля фактично порожні.

Хоча я ціную функціональність автофокусування, я не можу придумати належну причину, щоб хтось хотів, щоб форма автоматично очищалася.

Джерело

На жаль, функція була жорстко закодована wp-login.phpв рядках 913-930 (WordPress 4.0). Змінити wp-login.phpфайл - це погана ідея, оскільки його можна буде перезаписати в будь-якому майбутньому оновлення WordPress. Тож доведеться вдатися до «хакерства».

Просте виправлення

wp_attempt_focusФункція викликається , якщо форма не має помилок. Нам пощастило - перевірка помилок проводиться через PHP. Це означає, що ми можемо просто запобігти запуску функції, підробивши помилку форми у потрібний час за допомогою дій WP. Я вибрав login_formдію, оскільки дія завжди запускається після обробки помилок, безпосередньо перед викликом JS. Додайте такий код functions.php(або файл плагіна):

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

Виправлення хакі

Виправлене вище застереження запобігає функціонуванню функції взагалі, а значить, і автоматичного фокусування також не вийде. Є й інший спосіб: буферизація HTML виводу та модифікація за допомогою ob_startнатхнення Geeklab . Буферизація дозволяє нам видалити певні частини коду - у цьому випадку автоядерну частину d.value = ''. Не забудьте промити буфер.

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();
}

2
Видатний. Виправлення для цього слід застосувати до ядра. Я отримав багато коментарів користувачів, які мають проблеми з цим. Дякуємо, що поділилися виправленням.
Крістін Купер

Дякую за рішення. Також вважайте, що це не повинно бути в основі.
ThiagoPonte

0

У мене теж була ця проблема. Вимкнув плагін "WP-SpamShield" Скотта Аллена і все почало працювати знову.


0

Мій пароль був просто порожнім / нульовим, тому я спробував змінити його на щось інше, наприклад "1234". Додавання простору та видалення його не спрацювало, а також відключення JS. Також спробував інший браузер, так чи справді це лише в Chrome

Що я зробив, це те, що я змінив хеш паролів у базі даних, і він працював. wp_users.user_pass.

у моєму випадку пароль 1234є зашифрованим:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

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

зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.