避免WordPress登陆用户名被他人获取

这篇文章中假设www.baidu.com是一个WP网站。

问题场景:
在浏览器中通过输入网址:http://www.baidu.com/?author=2,响应结果中可获取WP用户登陆名。

本文正是为应对该漏洞引起的密码破解风险而写的解决方案。

应对方法:
1.针对网址中泄漏用户名的应对方法:

编辑:./wp-includes/author-template.php,在该文件末尾添加如下代码:

/**
* 修改url重写后的作者存档页的链接变量
*/
add_filter( 'author_link', 'lxtx_author_link', 10, 2 );
function lxtx_author_link( $link, $author_id) {
global $wp_rewrite;
$author_id = (int) $author_id;
$link = $wp_rewrite->get_author_permastruct();
if ( empty($link) ) {
$file = home_url( '/' );
$link = $file . '?author=' . $author_id;
} else {
$link = str_replace('%author%', $author_id, $link);
$link = home_url( user_trailingslashit( $link ) );
}
return $link;
}

/*
*  如果没有添加下面这个方法,
*  在发起了:http://www.baidu.com/?author=2请求后,页面会返回404 NOT FOUND。
*/

/**
* 替换作者的存档页的用户名,防止被其他用途
* 作者存档页链接有2个查询变量,
* 一个是author(作者用户id),用于未url重写
* 另一个是author_name(作者用户名),用于url重写
* 此处做的是,在url重写之后,把author_name替换为author
* @link https://www.wpdaxue.com/use-nickname-for-author-slug.html
*/

add_filter( 'request', 'lxtx_author_link_request' );
function lxtx_author_link_request( $query_vars ) {
if ( array_key_exists( 'author_name', $query_vars ) ) {
global $wpdb;
$author_id=$query_vars['author_name'];
if ( $author_id ) {
$query_vars['author'] = $author_id;
unset( $query_vars['author_name'] );
}
}
return $query_vars;
}

2. 针对BODY中class泄漏用户名的应对方法:

编辑:./wp-includes/functions.php,在该文件末尾添加如下代码:

/**
 *(全网独家)如何正确的避免你的 WordPress 管理员登录用户名被暴露 - 龙笑天下
 * http://www.ilxtx.com/further-hide-your-wordpress-admin-username.html
 * 说明:直接去掉函数 comment_class() 和 body_class() 中输出的 "comment-author-" 和 "author-"
 */
function lxtx_comment_body_class($content){ 
 $pattern = "/(.*?)([^>]*)author-([^>]*)(.*?)/i";
 $replacement = '$1$4';
 $content = preg_replace($pattern, $replacement, $content); 
 return $content;
}
add_filter('comment_class', 'lxtx_comment_body_class');
add_filter('body_class', 'lxtx_comment_body_class');

代理原理:

添加了一个过滤器,将涉及”body_class”和”comment_class”的请求重定向到方法:lxtx_comment_body_class来处理。该方法会通过正则匹配过滤掉响应报文里的name跟userid。


(本文所列PHP代码为引用,源作者地址附于文章末尾)
附:
原文链接
原创作者详细剖析

测试过程中,建议使用Chrome。如果用Firefox测试的话,即使PHP代码修改了,在Firefox页面刷新后还是显示不出代码修改后的效果,应该跟缓存有关。

Leave a Reply

Your email address will not be published.