WordPress隐藏前台登录用户名

最近在查看`Limit Login Attempts`日志的时候,发现大量的登陆尝试,关键是登陆使用的用户名是正确的。感到很奇怪,用户名是如何泄漏的呢?

网上搜寻了一下,发现原来用户名是被`WordPress`主动泄漏出来的。

`WordPress`鼠标点击前台用户名,浏览器就会跳转到 https://www.mobibrw.com/author/username 这个链接,这样一来就直接暴露了登陆用户名,哪怕你已经在前台使用了昵称。这是个很大的安全隐患!

后台登陆用户名也可以这样查看到:https://www.mobibrw.com/?author=1,多用户的可以把 1 变为 2、3、4、5 等,就可以在地址栏查看到各个用户名。

为了避免暴露登陆用户名,我们需要配置禁止用户名显示。我们需要在当前使用的主题的`functions.php`中增加如下函数

<?php
/////////////////////隐藏用户名信息相关/////////////////////

  // 隐藏用户名
  add_filter('author_link', function($link, $author_id, $author_nicename){
    $author  = get_userdata($author_id);
  
    if(sanitize_title($author->user_login) == $author_nicename){
      global $wp_rewrite;
      $link  = $wp_rewrite->get_author_permastruct();
      $link  = str_replace('%author%', $author_id, $link);
      $link  = home_url(user_trailingslashit($link));
    }
    return $link;
  }, 10, 3);

  // 原作者页直接404
  add_action('pre_get_posts',  function($wp_query) {
    if($wp_query->is_main_query() && $wp_query->is_author()) {
      if($author_name = $wp_query->get('author_name')){
        $author_name = sanitize_title_for_query($author_name);
        $author = get_user_by('slug', $author_name);
        if($author) {
          if(sanitize_title($author->user_login) == $author->user_nicename){
            $wp_query->set_404();
          }
        } else {
          if(is_numeric($author_name)) {
            $wp_query->set('author_name', '');
            $wp_query->set('author', $author_name);
          }
        }
      }
    }
  });

  //修改body_class
  add_filter('body_class', function($classes) {
    if(is_author()) {
      global $wp_query;
      $author = $wp_query->get_queried_object();
      if(sanitize_title($author->user_login) == $author->user_nicename) {
        $author_class = 'author-'.sanitize_html_class($author->user_nicename, $author->ID);
        $classes = array_diff($classes, [$author_class]);
      }
    }
    return $classes;
  });

  //修改comment_class
  add_filter('comment_class', function ($classes) {
    foreach($classes as $key => $class) {
      if(strstr($class, 'comment-author-')) {
        unset($classes[$key]);
      }
    }
    return $classes;
  });

  //禁用 REST API 过滤部分端点
  //解决通过 https://www.mobibrw.com/wp-json/wp/v2/users 获取用户列表的问题
  add_filter( 'rest_endpoints', function( $endpoints ){
    if ( isset( $endpoints['/wp/v2/users'] ) ) {
        unset( $endpoints['/wp/v2/users'] );
    }
    if ( isset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ) ) {
        unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
    }
    return $endpoints;
  });

// -- END ---------------------------------------- 
?>

参考链接