本文讲述如何通过添加WordPress动作阻止某些用户名(黑名单)的注册和登录,在注册或登录之前通过程序判断校验用户名合法性才可进行注册或登录操作,这样做可以保留用户名,也达到防止暴力破解的效果。

黑名单的必要性

WordPress是目前世界上最受欢迎的开源建站系统,这也代表着想打WordPress系统主意的人也很多,如果你也使用WordPress, 而且你允许用户访问你的登录页(wp-login.php),那你肯定也经常在网站访问日志中看到有很多恶意登录的记录,都是使用一些常用的用户名和密码 字典进行反复尝试登录,虽然一般都不会破解到帐号密码,但是这样的扫描也浪费了不少服务器资源。

因为WordPress的系统结构的原因,黑客很容易就能获取到管理员(也就是第一个用户)的用户名,然后使用这个用户名进行暴力破解。但是,如果我们拒绝这个用户名的登录动作,那无论破解工具跑多久都不会有结果。

解决思路

通过判断注册和登录 POST 数据中的用户名决定是否允许执行注册或登录动作。

注册判断使用 register_post 动作,登录判断使用 wp_authenticate 动作。

实现代码


//注册登录检查
function dmeng_check_authentication($username){
    //用 | 分割用户名,且 | 前后不留空格
    $black_list = 'admin|administrator|guest|root|test|tester';
    if( !empty($black_list) ){
        $black_list = explode('|', $black_list);
        if( in_array($username, $black_list) ){
            wp_die( __( '该用户名已被系统保留,不能用于注册或登录!', 'dmeng' ), '', array( 'back_link'=>true ) );
        }
    }
}
add_action ('wp_authenticate' , 'dmeng_check_authentication');
add_action ('register_post' , 'dmeng_check_authentication');

以上的代码拒绝了 admin、administrator、guest、root、test、tester 这几个用户名的注册和登录动作,当然了,如果你只想拒绝登录,你可以把这行删掉:
add_action ('register_post' , 'dmeng_check_authentication');
如果你只想拒绝注册,你可以把拒绝登录这行删掉:
add_action ('wp_authenticate' , 'dmeng_check_authentication');
如果你想要注册黑名单和登录黑名单不一样,你可以分别调用两个不同函数。但是!请注意:在这个名单里的用户名都不能注册或登录,包括管理员(假如管理员用户名也在里面的话)。
建议给WordPress添加邮箱登录功能,然后把管理员用户名也加入黑名单,然后使用管理员邮箱登录,这样做的话,那些使用获取到的管理员用户名进行暴力破解的就全都被拒绝登录动作了!