Error 'El campo de contraseña está vacío' al usar el autocompletado en Chrome

10

Cuando abro la pantalla de inicio de sesión en Chrome, el navegador llena automáticamente el formulario con mi nombre de usuario y contraseña. Sin embargo, cuando presiono el botón Enviar, recibo el siguiente mensaje:

ERROR: el campo de contraseña está vacío.

Agregar un espacio a la contraseña rellenada automáticamente y eliminarla nuevamente me permite iniciar sesión. ¿Qué está pasando?

Robbert
fuente

Respuestas:

15

La función de JavaScript wp_attempt_focusestá causando este problema. La función se activa poco después de cargar la página, borra el formulario y se enfoca en él, obligando a los usuarios a ingresar manualmente su información de inicio de sesión.

Chrome está completando el nombre de usuario y la contraseña automáticamente, solo milisegundos antes de que la función JS borre el campo. Chrome no recoge correctamente los cambios, mostrando campos rellenos de color amarillo a pesar de que los campos están realmente vacíos.

Aunque aprecio la funcionalidad de enfoque automático, no puedo pensar en una buena razón por la que alguien quiera que el formulario se borre automáticamente.

La fuente

Lamentablemente, la función se ha codificado wp-login.phpen las líneas 913-930 (WordPress 4.0). Cambiar el wp-login.phparchivo por completo es una mala idea, ya que podría sobrescribirse en cualquier próxima actualización de WordPress. Entonces tendremos que recurrir a un poco de 'pirateo'.

La solución fácil

Se wp_attempt_focusllama a la función si el formulario no tiene errores. Estamos de suerte: la comprobación de errores se realiza a través de PHP. Esto significa que simplemente podemos evitar que la función se active falsificando un error de formulario en el momento adecuado mediante acciones de WP. Elegí la login_formacción ya que la acción siempre se dispara después del manejo de errores, justo antes de la llamada JS. Agregue el siguiente código a su tema functions.php(o archivo de complemento):

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

La solución hack

La solución anterior evita que la función se active por completo, lo que significa que tampoco obtendrá el enfoque automático adecuado. Hay otra forma ob_startde evitarlo : almacenando en búfer la salida HTML y modificándola a través de , inspirada en Geeklab . El almacenamiento en búfer nos permite eliminar porciones específicas de código, en este caso, la parte autoclear d.value = ''. Sin embargo, no olvides vaciar el búfer.

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
fuente
2
Excepcional. Una solución para esto debería aplicarse al núcleo. He recibido muchos comentarios de usuarios que tienen problemas con esto. Gracias por compartir la solución.
Christine Cooper
Gracias por la solución. También piense que esto no debería estar en el núcleo.
ThiagoPonte
0

También tuve este problema. Apagó el plugin "WP-SpamShield" de Scott Allen y todo comenzó a funcionar nuevamente.

ERM
fuente
0

Mi contraseña estaba vacía / nula, así que intenté cambiarla por otra, como "1234". Agregar el espacio y eliminarlo no funcionó, tampoco deshabilitó JS. También probé un navegador diferente, ¿es realmente solo en Chrome?

Lo que hice fue cambiar el hash de contraseña en la base de datos y funcionó. wp_users.user_pass.

en mi caso la contraseña 1234es como BCrypted:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

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

imagen

P_95
fuente