wordpress默认登录地址是公开的,登录也不需要用验证码。这样就可能遇到口令攻击。就是不停的测试用户名和登录口令,如果密码不够安全,那就遭殃了。不过wordpress的可扩展性很强大。添加一个限制登录次数的功能也很方便。
wordpress 根据ip 限制用户登陆的次数
首先在用户登陆的时候,记录用户的登陆ip,如果登陆失败,就把该ip对应的值加1,如果该ip对应的值到5了。就说明,该ip尝试登陆了5次,然后就阻止该ip的登陆。如果用户登陆成功了,就把该ip对应的值设置成0。这样对正常的用户是没有影响的。
需要了解相关的wordoress钩子
- login_head -- 用来在登录的前 判断该ip登陆失败的次数(超过5次,阻止登陆)
- login_errors -- 用户登录失败的处理,(失败次数加1)
- 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试图登陆网站。