Site Loader

某客户告知,企业网站后台管理员的登录密码忘记了,进行密码重设操作,点击邮件中密码重设链接跳转后,提示“您的密码重设链接无效,请在下方请求新链接。”

重新输入用户名或电子邮件地址,再次获取新密码,问题复现。

  • CMS系统

    WordPress 版本5.3.2

  • 操作系统

    Ubuntu 18.04.4 LTS

是什么原因导致呢?经过分析,问题原来出在邮件中的重设链接上,我们来看一下邮件当中的链接。

鼠标指着邮件中的链接,注意看浏览器左下方当前链接提示,链接最后面是不是多了一个“右尖括号”?

有趣的是,问题貌似多出现在企鹅系邮箱系统,以下是outlook.com邮箱的网页截图,没有上面所述情况。

其他邮箱待测试。

根源找到了,如何解决呢?

SSH链接Ubuntu,到网站的根目录,编辑wp-login.php。

找到以下代码。

$message .= '<' . network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . ">\r\n"; 

删除前面的 ‘<‘ . ,以及后面的 >

$message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . "\r\n"; 

编辑wp-includes/pluggable.php

找到以下代码

 $message .=  '<' . network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user->user_login ), 'login' ) . ">\r\n\r\n"; 

同样删除前面的 ‘<‘ . ,以及后面的 >

$message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user->user_login ), 'login' ) . "\r\n\r\n"; 

再次操作密码重设,前后的尖括号没有了。

点击重设链接,密码重设页面可以正常显示了。

但小编通过在另一个WordPress网站上测试,以上办法并不凑巧,无论小编如何修改以上两个文件,密码重置邮件中的链接仍然带有尖括号。

当然,你可以通过复制链接,粘贴到浏览器地址栏,删除尖括号,再打开链接来处理,但对于一般用户来说还是不方便的。

经过一番思索,原来是网站为了保护后台登录地址,防止暴力破解,使用了All In One WP Security & Firewall插件中的“重命名登录页面功能”,更改了默认的后台登录地址所导致。同时也不引用以上所述两个文件了。

我们来做个测试,启用All In One WP Security & Firewall插件,启用“重命名登录页面功能”,输入aaa,如下图,保存设置,WordPress默认的后台登录地址是“网址/wp-admin”,修改后将变成“网址/aaa”。

在修改后的后台登录页面进行密码重设操作,打开邮件,链接如下显示。

点击后,同样显示链接无效。

对比一下未启用“重命名登录页面功能”时,邮件所显示的链接,是默认的wp-login.php。

怎么办?停用“重命名登录页面功能”?网站的安全保护措施还是需要的,总不能杀鸡取卵。

以下使用另一种解决办法,不管有没有使用All In One WP Security & Firewall插件,修不修改wp-login.php和pluggable.php两个文件,此方法也是适用的。

使用WordPress后台的主题编辑器或在服务器上进入当前主题的目录,编辑functions.php文件,在最后添加以下代码。

请注意$msg .= network_site_url开头的那一行代码,由于小编启用了“重命名登录页面功能”,并设置成aaa,所以此处是aaa,可改成你启用“重命名登录页面功能”时所设置的地址。

如没有使用“重命名登录页面功能”,此处应改为默认的wp-login.php。

其中“站点名称”一项也可按实际情况修改。

function reset_password_message( $message, $key ) {
    if ( strpos($_POST['user_login'], '@') ) {
    $user_data = get_user_by('email', trim($_POST['user_login']));
} else {
    $login = trim($_POST['user_login']);
    $user_data = get_user_by('login', $login);
}
    $user_login = $user_data->user_login;
    $msg .= ('有人为以下账号请求了密码重置:'). "\r\n\r\n";
    $msg .= ('站点名称:Him Study | 谦学网'). "\r\n\r\n";
    $msg .= sprintf(__('用户名:%s'), $user_login) . "\r\n\r\n";
    $msg .= ('若这不是您本人要求的,请忽略本邮件,一切如常。') . "\r\n\r\n";
    $msg .= ('要重置您的密码,请打开下面的链接:'). "\r\n\r\n";
    $msg .= network_site_url("aaa?action=rp&key=$key&login=" . rawurlencode($user_login), 'login' ) ."\r\n\r\n";
     return $msg;
}
add_filter('retrieve_password_message', reset_password_message, null, 2); 

保存后再进行密码重设测试,收到邮件所示链接如下。

点击重置链接,重置密码页面可以正常显示了。

问题解决!

Post Author: 回车

发表评论

电子邮件地址不会被公开。 必填项已用*标注