web-dev-qa-db-fra.com

Erreur 'Le champ du mot de passe est vide' lors de l'utilisation du remplissage automatique dans Chrome

Lorsque j'ouvre l'écran de connexion sur Chrome, le navigateur remplit automatiquement le formulaire avec mon nom d'utilisateur et mon mot de passe. Cependant, lorsque je clique sur le bouton d'envoi, le message suivant s'affiche:

ERREUR: le champ du mot de passe est vide.

Ajouter un espace au mot de passe rempli automatiquement et le supprimer à nouveau me permet de me connecter. Que se passe-t-il?

11
Robbert

La fonction JavaScript wp_attempt_focus est à l'origine de ce problème. La fonction se déclenche peu de temps après le chargement de la page, efface le formulaire et se concentre sur celui-ci, forçant les utilisateurs à entrer manuellement leurs informations de connexion.

Chrome renseigne automatiquement le nom d'utilisateur et le mot de passe, quelques millisecondes seulement avant que la fonction JS n'efface le champ. Chrome ne récupère pas correctement les modifications et affiche des champs remplis de couleur jaune, même s'ils sont vides.

Bien que j'apprécie la fonctionnalité de mise au point automatique, je ne vois pas pourquoi tout le monde voudrait que le formulaire soit automatiquement effacé.

La source

Malheureusement, la fonction a été codée en dur dans wp-login.php aux lignes 913 à 930 (WordPress 4.0). Changer complètement le fichier wp-login.php est une mauvaise idée, car il pourrait être écrasé dans une prochaine mise à jour de WordPress. Nous devrons donc recourir à un peu de "piratage".

La solution facile

La fonction wp_attempt_focus est appelée si le formulaire ne contient aucune erreur. Nous avons de la chance - la vérification des erreurs se fait via PHP. Cela signifie que nous pouvons simplement empêcher la fonction de se déclencher en simulant une erreur de formulaire au bon moment en utilisant les actions WP. J'ai choisi l'action login_form puisque l'action déclenche toujours après le traitement des erreurs, juste avant l'appel JS. Ajoutez le code suivant au functions.php (ou au fichier plugin) de votre thème:

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

Le correctif hackish

Le correctif ci-dessus empêche la fonction de se déclencher complètement, ce qui signifie que vous n'obtiendrez pas non plus l'autofocus approprié. Il existe un autre moyen de contourner le problème: mettre en tampon la sortie HTML et la modifier via ob_start, inspirée par Geeklab . La mise en mémoire tampon nous permet de supprimer des parties spécifiques du code - dans ce cas, la partie autoclear d.value = ''. N'oubliez pas de vider le tampon cependant.

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

J'ai eu ce problème également. Le plug-in "WP-SpamShield" de Scott Allen a été désactivé et tout a recommencé à fonctionner.

0
ERM

Mon mot de passe était juste vide/nul, j'ai donc essayé de le remplacer par autre chose, comme "1234". Ajouter de l'espace et le supprimer ne fonctionnaient pas, pas plus que désactiver JS. Également essayé un autre navigateur alors est-ce vraiment seulement dans Chrome?

Ce que j'ai fait est que j'ai changé le hachage du mot de passe dans la base de données et cela a fonctionné. wp_users.user_pass.

dans mon cas, le mot de passe 1234 est le suivant: BCrypted: $2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

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

 image 

0
P_95