有朋自远方来,不亦乐乎。
纯代码避免WordPress管理员登录用户名被暴露
原创 橘子书  发布于 2年前 ( 2016-11-02 ) 阅读: 1,242 次 抢沙发 A+

作为一个Wordpress折腾者,几乎每个人都被一件事所烦扰,那就是暴力破解,这些机器每天不劳其烦地扫了一遍又一遍我们的登录页面,企图测试出我们博客管理员的真实登录名跟密码。

但是,如果管理员的登录名在评论区域呢?只要用心人轻轻松松审查一下元素,就能找到登录名,然后进行暴力破解,那事情就麻烦了。

审查元素,可以得到如下信息:

<li class="comment byuser comment-author-admin bypostauthor odd alt thread-odd thread-alt depth-1" id="li-comment-34">

其中,我们可以很直观地看到admin这个登录名。

这个问题是龙笑天下在昨天发现的漏洞,范围几乎涉及全部的Wordpress站点,属于Wordpress官方没有意料到的bug。针对这个漏洞,他提出了解决办法《(全网独家)如何正确的避免你的 WordPress 管理员登录用户名被暴露,方法也很简单,就是修改Wordpress程序(跟我们的主题没关系),弊端也很显著,就是每次升级Wordpress版本都要自己再修改一次。

于是,今天在群里懿古今提出了另外一种方法,只需要修改自身使用的主题即可,但是依旧有弊端:他的方法只适合知更鸟主题为框架或者类似知更鸟主题结构的主题如何正确的避免WordPress管理员登录用户名被暴露)。

龙砚庭的纯代码处理

好吧,作为一个懒癌末期的人,我是肯定不会用第一种方法,然后懿古今的第二种方法貌似只适合begin主题、nana主题、three主题,因为Pisces主题也是有古今兄所说的那个comment-template.php文件,而且代码部署一模一样,奈何我根据他的方法来操作,依旧没办法屏蔽掉漏洞的存在。

于是,自行摸索了一下,发现方法也很简单,以下教程适用任何一个Wordpress主题。

1.找代码

打开自身使用的主题,用DW搜索函数:

<?php comment_class(); ?> 

ps:一般而言,大部分的主题都会在functions.php文件里面自定义评论输出,所以这个函数一般都会有(不懂怎么找的博友,可以先打开functions.php,找找看有没有评论输出定义的相关代码,找到类似?php comment_class)。

2.替换代码

理论来说,直接删掉即可,但考虑到有些人害怕主题崩了。可以在修改之前先审查自己的博客元素,找到那段class代码。

比如:

<li class="comment byuser comment-author-修改为自定义 bypostauthor odd alt thread-odd thread-alt depth-1" id="li-comment-34">

将里面的‘修改为自定义’改为自己需要的假名,也可以用数字顶替,然后将整段代码替换第一步找到的那个函数。保存即可!

其他补充

很多主题都有作者归档存链页,这个页面也会导致管理员登录名的暴露。所以,这里直接搬运龙笑天下的教程代码,直接扔到functions.php即可(两种改法,任选其一)。

1.改为用户昵称
/**
 * 将WordPress作者存档链接中的改为用户昵称 - 龙笑天下
 * http://www.ilxtx.com/use-user-nickname-or-id-for-author-slug.html
 * 将WordPress作者存档链接中的用户名改为昵称
 * https://www.wpdaxue.com/use-nickname-for-author-slug.html
 */
//使用昵称替换用户名,通过用户ID进行查询
add_filter( 'request', 'lxtx_wpdaxue_request' );
function lxtx_wpdaxue_request( $query_vars )
{
    if ( array_key_exists( 'author_name', $query_vars ) ) {
        global $wpdb;
        $author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key='nickname' AND meta_value = %s", $query_vars['author_name'] ) );
        if ( $author_id ) {
            $query_vars['author'] = $author_id;
            unset( $query_vars['author_name'] );    
        }
    }
    return $query_vars;
}
 
//使用昵称替换链接中的用户名
add_filter( 'author_link', 'lxtx_wpdaxue_author_link', 10, 3 );
function lxtx_wpdaxue_author_link( $link, $author_id, $author_nicename )
{
    $author_nickname = get_user_meta( $author_id, 'nickname', true );
    if ( $author_nickname ) {
        $link = str_replace( $author_nicename, $author_nickname, $link );
    }
    return $link;
}
2.改为用户ID
/**
 * 将WordPress作者存档链接中的用户名改为用户ID - 龙笑天下
 * http://www.ilxtx.com/use-user-nickname-or-id-for-author-slug.html
 * 修改url重写后的作者存档页的链接变量
 * @since yundanran-3 beta 2
 * 2013年10月8日23:23:49
 */
add_filter( 'author_link', 'lxtx_yundanran_author_link', 10, 2 );
function lxtx_yundanran_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;
}

/**
 * 替换作者的存档页的用户名,防止被其他用途
 * 作者存档页链接有2个查询变量,
 * 一个是author(作者用户id),用于未url重写
 * 另一个是author_name(作者用户名),用于url重写
 * 此处做的是,在url重写之后,把author_name替换为author
 * @version 1.0
 * @since yundanran-3 beta 2
 * 2013年10月8日23:19:13
 * @link http://www.wpdaxue.com/use-nickname-for-author-slug.html
 */
add_filter( 'request', 'lxtx_yundanran_author_link_request' );
function lxtx_yundanran_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;
}

末了

解释一下上文提到的那个函数作用吧,它其实就是一段class的调用输出函数,具体输出样式类似如下:

class="xxxxx xxxx xxx xx x"

所以在替换的时候,一定要将整个函数都替换掉,一般这个函数的样式如下:

//原始样式:
<?php comment_class(); ?> 

//变化的样式(类似):
<?php comment_class( empty( $args['has_children'] ) ? '' : 'xxxx' ) ?>

END(剩下的,就自行摸索了)

Principle Team
龙砚庭官方QQ群,一个坚持强怼的7P成员群!
10人已关注

该文章还没有任何评论,你来说两句吧.

发表评论

莫慌,小狮子正在努力加载评论...