来自老赵茶馆: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;
}

标签:web安全, WordPress

你的评论