WordPress 登录保护加强版
来自老赵茶馆:WordPress 登录保护加强版
事关自从添加了登录失败的邮件通知后,一直有人反馈说有机器人暴力破解,而收到一大堆邮件。不过实际上只要你的用户们和密码足够复杂,机器人没几万年也破解不了。
请看下面所谓的修改后台登录地址的保护方法:
//保护后台登录
add_action('login_enqueue_scripts','login_protection');
function login_protection(){
if($_GET['admin'] != 'true')header('Location: http://lazyhood.com/');
}
这种方法只等挡住人为的破解,机器人压根不会访问Wordpress后台的登录地址,而是通过以post方式提交的登录请求的。
所以只能想办法了,一就是安装一些登录保护插件例如lockdown,一就是添加保护代码到functions.php,我选择后者。谷歌后得到的答案是这样子的,提供了三重登录保护。
首先是阻止与HTTP 1.0的任何登录POST请求,因为常见的机器人都是使用HTTP1.0,这应该有效地阻止他们登录:
//过滤HTTP 1.0的登录POST请求
function wlp_filter_http() {
if(preg_match('/1.0/',$_SERVER['SERVER_PROTOCOL'])) { wlp_forbidden(); }
}
add_action('login_init','wlp_filter_http');
然后是通过设置一个cookie的初始值,如果cookie不存在POST请求,登录会被阻止:
// POST Cookie 保护
function wlp_set_login_protection_cookie() {
if( strtoupper($_SERVER['REQUEST_METHOD'])=='GET' and
!isset($_COOKIE['wlp_post_protection']) ) {
setcookie('wlp_post_protection','1',time()+60*60*24);
$_COOKIE['wlp_post_protection'] = '1';
}
}
function wlp_post_protection() {
if( strtoupper($_SERVER['REQUEST_METHOD'])=='POST' and
!isset($_COOKIE['wlp_post_protection']) ) {
wlp_forbidden();
}
}
add_action('init','wlp_set_login_protection_cookie');
add_action('login_init','wlp_post_protection');
最后是增加额外登录验证,这将增加一层额外的WordPress的登录页面,这是一个更积极的做法,而应完全防止任何从机器人甚至试图WordPress的登录,不同于修改你的网络服务器配置,以增加基本身份验证,这种方法不会破坏AJAX行为的功能。
// 增加额外登录验证
function wlp_basic_auth() {
if( !isset($_SERVER['PHP_AUTH_USER']) or !isset($_SERVER['PHP_AUTH_PW']) )
wlp_unauthorized(__('No credentials have been provided.', 'memberpress'));
else {
$user = wp_authenticate($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
if(is_wp_error($user))
wlp_unauthorized( $user->get_error_message() );
}
}
function wlp_unauthorized($message) {
header('WWW-Authenticate: Basic realm="' . get_option('blogname') . '"');
header('HTTP/1.0 401 Unauthorized');
die(sprintf(__('UNAUTHORIZED: %s', 'memberpress'),$message));
}
add_action('login_init','wlp_basic_auth');
最最后的一步是当登录失败时,让服务器返回403状态:
// 登录错误,返回403状态
function wlp_forbidden() {
header("HTTP/1.0 403 Forbidden");
exit;
}