2021.05.01

【WordPress】【セキュリティ対策】ログインユーザー情報は非表示にしよう

こんにちは、webエンジニアのゾノ( @ozonosho )です。

セキュリティ基準がしっかりしている企業案件の場合、WordPressの初期ファイルや初期機能をそのままにしていると納品時にNGとなるチェックポイントが多々あります。

そんな場面に出くわしたときのために、何回かに分けて対策を紹介していきます。

今回はログインユーザー情報の非表示設定についてです。

WordPressを利用しているサイトは、WP REST APIにアクセスしたり著者アーカイブページを閲覧したりすることで第三者でも簡単にログインユーザー情報(ユーザーIDやユーザー名)を取得できてしまいます。

ログインユーザー情報を取得されてしまうと総当り攻撃(Brute-Force)による被害リスクが上がるため、WP REST APIや著者アーカイブページを利用していない場合にはそれぞれ廃止またはアクセスを限定させるなどの対策をしましょう。

そんなわけで、WP REST APIからのアクセスを回避する対策ならびに著者アーカイブページの閲覧を回避する対策をご紹介します。

①WP REST APIからのアクセスを回避する対策

ログインしていない場合にWP REST API自体を無効にする処理を加え、WP REST APIからアーカイブ情報にアクセスすることを防ぎます。

WP REST APIを利用しているプラグインがある場合には、そのプラグインのみアクセスを許可することで対応するのが良いです。

(実装例)
functions.phpに以下のようなコードを追加します。

function deny_rest_api_except_permitted($result, $wp_rest_server, $request) {
    //許可するプラグイン名を入れる。
    //例)$permitted_routes = ['contact-form-7', 'akismet'];
    $permitted_routes = [];
    $route = $request->get_route();
    foreach ($permitted_routes as $r) {
        if (strpos($route, "/$r/") === 0)
            return $result;
    }
    //ログインユーザーは通す(サイトごとの運用に合わせ、管理者のみ通すなどに書き換えて使用)
    if (is_user_logged_in()) {
        return $result;
    }
    return new WP_Error('rest_disabled', __('The REST API on this site has been disabled.'),
        array('status' => rest_authorization_required_code()));
}
add_filter('rest_pre_dispatch', 'deny_rest_api_except_permitted', 10, 3);

②著者アーカイブページの閲覧を回避する対策

WordPressを利用しているサイトは初期仕様で「https://ドメイン/author/ユーザー名」というURLに著者アーカイブページが生成されます。

ユーザー名はログインにも利用される情報なので、URLから管理者を含むユーザーのユーザー名が取得できてしまうのは少し危うい設計です。そのため利用していないのであれば下記のコードで廃止しましょう。

著者アーカイブページをすべて廃止する場合

functions.phpに下記コードを記載することで著者アーカイブページを完全に廃止することができます。

add_filter( 'author_rewrite_rules', 
'__return_empty_array' );

管理者の著者アーカイブページだけ廃止する場合

functions.phpに下記コードを記載することで特定の権限を持つユーザーの著者アーカイブページだけを廃止することもできます。

//不適切ページを404にする
function disable_some_archives() {
  global $wp_query;
  if(is_author()) {
    global $author;
    //管理者の著者アーカイブページ
    if(user_can($author, 'administrator')) {
      $wp_query->set_404();
      status_header(404);
      get_template_part(404); //404ページ用のテンプレートに飛ばす
      exit;
    }
  }
}
add_action('wp', 'disable_some_archives');

おわりに

以上、今回の記事ではWP REST APIからのアクセスを回避する対策ならびに著者アーカイブページの閲覧を回避する対策を紹介させていただきました。

どちらも対策しておけばログインユーザー情報を第三者に取得されて総当り攻撃を受けるリスクが下がります。ぜひ活用ください。

当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。

あなたのサイトに理想の機能を実装!WordPressカスタマイズサービス

本サービスはあなたのWordPressサイトに理想の機能を実装するサービスとなります。 どのような機能・要望でも実現可能です! Wo......

→この記事を読む