Ошибка «Поле пароля пусто» при использовании автозаполнения в Chrome

10

Когда я открываю экран входа в Chrome, браузер автоматически заполняет форму моим именем пользователя и паролем. Однако, когда я нажимаю кнопку отправки, я получаю следующее сообщение:

ОШИБКА: поле пароля пустое.

Добавление пробела к автозаполненному паролю и его повторное удаление позволяет мне войти в систему. Что происходит?

Robbert
источник

Ответы:

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();
}
Robbert
источник
2
Отлично. Исправление для этого должно быть применено к ядру. Я получил много комментариев от пользователей, у которых есть проблемы с этим. Спасибо, что поделились исправлением.
Кристина Купер
Спасибо за решение. Также думаю, что это не должно быть в основе.
ThiagoPonte
0

У меня тоже была эта пробема. Выключил плагин «WP-SpamShield» Скотта Аллена, и все снова заработало.

ERM
источник
0

Мой пароль был просто пустым / пустым, поэтому я попытался изменить его на что-то другое, например «1234». Добавление пространства и его удаление не работало, не отключало JS. Также пробовал другой браузер, так это действительно только в Chrome?

Я изменил хэш пароля в базе данных, и он сработал. wp_users.user_pass,

в моем случае пароль 1234как BCrypted:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

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

образ

P_95
источник