wordpress不用插件实现根据ip限制用户登录的次数

作者

wordpress默认登录地址是公开的,登录也不需要用验证码。这样就可能遇到口令攻击。就是不停的测试用户名和登录口令,如果密码不够安全,那就遭殃了。不过wordpress的可扩展性很强大。添加一个限制登录次数的功能也很方便。

wordress 限制ip登陆的次数
wordress 限制ip登陆的次数

wordpress 根据ip 限制用户登陆的次数

首先在用户登陆的时候,记录用户的登陆ip,如果登陆失败,就把该ip对应的值加1,如果该ip对应的值到5了。就说明,该ip尝试登陆了5次,然后就阻止该ip的登陆。如果用户登陆成功了,就把该ip对应的值设置成0。这样对正常的用户是没有影响的。

需要了解相关的wordoress钩子

  1. login_head -- 用来在登录的前 判断该ip登陆失败的次数(超过5次,阻止登陆)
  2. login_errors -- 用户登录失败的处理,(失败次数加1)
  3. admin_menu -- 登录成功后,把该ip对应的登陆失败次数清零

具体的代码

# 阻止登录的函数,直接 404
function block_login() {
    header("HTTP/1.1 404 Not Found");
    header("Status: 404 Not Found");
    exit;
}

# 登录前判断登陆的失败次数
add_action("login_head",function () {
    $login_ip =  $_SERVER['REMOTE_ADDR'];
    $login_ip_list = unserialize(get_option("LOGIN_IP_LIST"));
    # 登录失败超过5次就进行阻止登陆
    if($login_ip_list && ($login_ip_list[$login_ip] > 5)) {
        block_login();
    }
});

# 登录失败的处理
add_action('login_errors', function ($info) {
    $login_ip =  $_SERVER['REMOTE_ADDR'];
    $login_ip_list = get_option("LOGIN_IP_LIST");
    if($login_ip_list) {
        $login_ip_list = unserialize($login_ip_list);
    } else {
        $login_ip_list = array();
    }

    # 登录次数 + 1
    $login_ip_list[$login_ip] += 1;

    update_option('LOGIN_IP_LIST', serialize($login_ip_list));

    # 提示登录失败的次数
    return "$login_ip 登陆次数 " . $login_ip_list[$login_ip];
});

# 证明已经登录成功了
add_action("admin_menu", function () {
    $login_ip =  $_SERVER['REMOTE_ADDR'];
    $login_ip_list = unserialize(get_option("LOGIN_IP_LIST"));
    $login_ip_list[$login_ip] = 0;
    update_option('LOGIN_IP_LIST', serialize($login_ip_list));
});

这样就实现了,限制每个ip登陆的次数。同时还可以看到有几个ip试图登陆网站。

回复

邮箱地址不会被公开。