오랫동안 블로그 글을 업데이트하지 않았고, 최근에는 딱히 쓸 만한 내용도 없었습니다. 국경절 연휴를 앞두고 있어서, 저는 지루한 것들을 찾아 글로 써 보기로 했습니다. 마침 오늘 WordPress 백엔드의 비밀번호를 변경하려고 했는데, WordPress의 작은 문제 하나를 발견했습니다(취약점이라고 하기도 어렵고, 작은 버그라고 할 수 있습니다). 비밀번호를 변경하면 시스템이 비밀번호 재설정 링크를 이메일로 보내는데, 원래는 문제가 없습니다. 이메일을 정상적으로 받은 후 이메일 링크를 클릭했더니 “비밀번호 재설정 링크가 유효하지 않습니다”라고 표시되었습니다.

실제로는 이메일로 전송된 주소 뒤에(>) 기호가 하나 더 붙어 있었습니다. 원래 WordPress가 보기 좋게 하려고 앞뒤에 꺾쇠괄호를 붙였는데, 오히려 이메일에서 주소의 일부로 해석해 버린 것입니다. 클릭하면 당연히 유효하지 않게 됩니다. 해결 방법은 매우 간단하며, 아래에 두 가지 방법을 소개하겠습니다.
방법 1
테마 루트 디렉터리의 functions.php 파일에 다음 코드를 삽입하면 됩니다.
/**
* 修复 WordPress 找回密码 bug
* 注:https://blog.ikxin.com/archives/80.html
*/
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 .= network_site_url() . "\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("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') ;
return $msg;
}
add_filter('retrieve_password_message', reset_password_message, null, 2);
이 방법의 단점은 테마를 변경한 후 코드를 다시 추가해야 한다는 것입니다.
방법 2
또 다른 방법은 WordPress 루트 디렉터리의 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)를 제거하는 것입니다. 하지만 이 방법은 WordPress를 업그레이드하면 적용되지 않게 됩니다. 업그레이드 후 해당 파일이 교체되기 때문에 wp-login.php를 다시 수정해야 합니다. 따라서 첫 번째 방법을 사용하는 것을 권장합니다.
