Lỗi trường 'Mật khẩu trống' khi sử dụng tự động điền trong Chrome


10

Khi tôi mở màn hình đăng nhập trên Chrome, trình duyệt sẽ tự động điền vào biểu mẫu với tên người dùng và mật khẩu của tôi. Tuy nhiên, khi tôi nhấn nút gửi, tôi nhận được thông báo sau:

LRI: Trường mật khẩu trống.

Thêm một khoảng trắng vào mật khẩu tự động điền và xóa lại mật khẩu sẽ cho phép tôi đăng nhập. Chuyện gì đang xảy ra?

Câu trả lời:


15

Hàm JavaScript wp_attempt_focus đang gây ra sự cố này. Chức năng kích hoạt ngay sau khi tải trang, xóa biểu mẫu và tập trung vào nó, buộc người dùng phải nhập thủ công thông tin đăng nhập của họ.

Chrome sẽ tự động điền tên người dùng và mật khẩu, chỉ một phần nghìn giây trước khi chức năng JS xóa trường. Chrome không nhận đúng các thay đổi, hiển thị các trường được tô màu vàng ngay cả khi các trường thực sự trống.

Mặc dù tôi đánh giá cao chức năng tự động lấy nét, tôi không thể nghĩ ra một lý do chính đáng để bất kỳ ai cũng muốn biểu mẫu tự động xóa.

Nguồn

Đáng buồn thay, chức năng này đã được mã hóa cứng wp-login.phptrong các dòng 913-930 (WordPress 4.0). Thay đổiwp-login.php tập tin hoàn toàn là một ý tưởng tồi, vì nó có thể bị ghi đè trong bất kỳ bản cập nhật WordPress sắp tới nào. Vì vậy, chúng tôi sẽ phải dùng đến một chút 'hack'.

Cách khắc phục dễ dàng

Các wp_attempt_focushàm được gọi nếu hình thức không có lỗi. Chúng tôi rất may mắn - việc kiểm tra lỗi được thực hiện thông qua PHP. Điều này có nghĩa là chúng ta có thể đơn giản ngăn chức năng bắn bằng cách giả mạo lỗi biểu mẫu vào đúng thời điểm bằng cách sử dụng các hành động WP. Tôi đã chọn login_formhành động vì hành động luôn kích hoạt sau khi xử lý lỗi, ngay trước lệnh gọi JS. Thêm mã sau vào chủ đề của bạn functions.php(hoặc tệp plugin):

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

Bản sửa lỗi

Cách khắc phục ở trên ngăn chức năng bắn hoàn toàn, nghĩa là bạn cũng sẽ không lấy nét tự động thích hợp. Có một cách khác xung quanh nó: đệm đầu ra HTML và sửa đổi nó thông qua ob_start, như được truyền cảm hứng bởi Geeklab . Bộ đệm cho phép chúng tôi loại bỏ các phần mã cụ thể - trong trường hợp này là phần tự động d.value = ''. Đừng quên xả đệm mặc dù.

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
Nổi bật. Một sửa chữa cho điều này nên được áp dụng cho cốt lõi. Tôi đã nhận được nhiều ý kiến ​​của người dùng có vấn đề với điều này. Cảm ơn đã chia sẻ sửa chữa.
Christine Cooper

Cảm ơn bạn cho giải pháp. Cũng nghĩ rằng điều này không nên là cốt lõi.
ThiagoPonte

0

Tôi cũng có vấn đề này. Đã tắt plugin "WP-SpamShield" của Scott Allen và mọi thứ bắt đầu hoạt động trở lại.


0

Mật khẩu của tôi chỉ trống / null nên tôi đã cố gắng thay đổi nó thành một cái khác, như "1234". Thêm không gian và loại bỏ nó không hoạt động cũng không vô hiệu hóa JS. Cũng đã thử trình duyệt khác nhau, vậy nó có thực sự chỉ có trong Chrome không?

Những gì tôi đã làm là tôi đã thay đổi mật khẩu băm trong cơ sở dữ liệu và nó đã hoạt động. wp_users.user_pass.

trong trường hợp của tôi, mật khẩu 1234là BCrypted:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

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

hình ảnh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.