Kesalahan 'Kata sandi kosong' saat menggunakan pengisian otomatis di Chrome

10

Ketika saya membuka layar login di Chrome, browser secara otomatis mengisi formulir dengan nama pengguna dan kata sandi saya. Namun, ketika saya menekan tombol kirim, saya mendapatkan pesan berikut:

GALAT: Bidang kata sandi kosong.

Menambahkan spasi ke kata sandi yang diisi otomatis dan menghapusnya lagi memungkinkan saya untuk login. Apa yang terjadi?

Robbert
sumber

Jawaban:

15

Fungsi JavaScript wp_attempt_focusmenyebabkan masalah ini. Fungsi ini akan menyala tidak lama setelah pemuatan halaman, membersihkan formulir dan memfokuskannya, memaksa pengguna untuk memasukkan informasi login mereka secara manual.

Chrome mengisi nama pengguna dan kata sandi secara otomatis, hanya milidetik sebelum fungsi JS menghapus bidang. Chrome tidak menerima perubahan dengan benar, menampilkan bidang berwarna kuning yang diisi meskipun bidang tersebut benar-benar kosong.

Meskipun saya menghargai fungsionalitas autofokus, saya tidak dapat memikirkan alasan yang baik mengapa seseorang ingin formulir tersebut dihapus secara otomatis.

Sumber

Sayangnya, fungsi tersebut telah di-hardcode wp-login.phppada baris 913-930 (WordPress 4.0). Mengubah wp-login.phpfile sama sekali adalah ide yang buruk, karena itu dapat ditimpa dalam pembaruan WordPress yang akan datang. Jadi kita harus melakukan sedikit 'peretasan'.

Memperbaiki mudah

The wp_attempt_focusfungsi disebut jika bentuk tidak memiliki kesalahan. Kami beruntung - pemeriksaan kesalahan dilakukan melalui PHP. Ini berarti kita bisa dengan mudah mencegah fungsi menembak dengan memalsukan kesalahan formulir pada waktu yang tepat menggunakan tindakan WP. Saya memilih login_formtindakan karena tindakan selalu menyala setelah penanganan kesalahan, tepat sebelum panggilan JS. Tambahkan kode berikut ke tema functions.php(atau file plugin) Anda:

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

Memperbaiki peretasan

Perbaikan di atas mencegah fungsi dari menembak sama sekali, yang berarti Anda tidak akan mendapatkan autofokus yang tepat juga. Ada cara lain di sekitarnya: buffering output HTML dan memodifikasinya via ob_start, seperti yang terinspirasi oleh Geeklab . Buffering memungkinkan kita untuk menghapus bagian kode tertentu - dalam hal ini, bagian autoclear d.value = ''. Jangan lupa untuk membersihkan buffer.

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
sumber
2
Luar biasa. Perbaikan untuk ini harus diterapkan ke inti. Saya telah menerima banyak komentar oleh pengguna yang memiliki masalah dengan ini. Terima kasih telah berbagi perbaikannya.
Christine Cooper
Terima kasih atas solusinya. Juga berpikir ini seharusnya tidak menjadi inti.
ThiagoPonte
0

Saya punya masalah ini juga. Mematikan plugin "WP-SpamShield" oleh Scott Allen dan semuanya mulai bekerja lagi.

ERM
sumber
0

Kata sandi saya hanya kosong / nol jadi saya mencoba mengubahnya ke sesuatu yang lain, seperti "1234". Menambahkan ruang dan menghapusnya tidak berfungsi dan tidak menonaktifkan JS. Juga mencoba peramban yang berbeda, jadi apakah hanya di Chrome?

Apa yang saya lakukan adalah saya mengubah hash kata sandi di database dan itu berhasil. wp_users.user_pass.

kata sandi saya dalam 1234BCrypted:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

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

gambar

P_95
sumber