在Chrome中使用自动填充功能时,“密码字段为空”错误


10

当我在Chrome上打开登录屏幕时,浏览器会自动用我的用户名和密码填写表单。但是,当我单击“提交”按钮时,收到以下消息:

错误:密码字段为空。

在自动填充的密码中添加一个空格并再次删除它,可以登录。这是怎么回事?

Answers:


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;
}

修补程序

上面的修复阻止了功能完全触发,这意味着您也不会获得正确的自动对焦。有另一种解决方法:ob_startGeeklab的启发,缓冲HTML输出并通过对其进行修改。缓冲允许我们删除代码的特定部分-在这种情况下,即自动清除部分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();
}

2
优秀。对此的修复应应用于核心。我收到了很多对此有疑问的用户的评论。感谢您共享此修复程序。
克里斯汀·库珀

谢谢您的解决方案。还认为这不应该成为核心。
ThiagoPonte 2015年


0

我的密码为空/空,因此我尝试将其更改为其他名称,例如“ 1234”。添加空间并删除它既无效也不禁用JS。还尝试了其他浏览器,所以真的只在Chrome中使用吗?

我所做的是更改了数据库中的密码哈希,并且该哈希有效。 wp_users.user_pass

就我而言,密码1234是BCrypted:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

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

图片

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.