ヘッダーのロゴ

すぐに仕事で使えるIT技術情報メディア

WordPressのセキュリティ実装をプラグインなしで実装する方法

投稿日:2024年04月08日(月) 更新日:2024年04月14日(日)
WordPressのセキュリティ実装をプラグインなしで実装する方法|WordPress MAGAZINE ワードプレスマガジン|すぐに仕事で使えるIT技術情報メディア

みなさんこんにちは!エンジニアの高澤です!

今回はWordPressのセキュリティ実装をプラグインなしで実装する方法について解説していきたいと思います。

セキュリティ機能を利用できるプラグインはいくつかありますが、場合によってはWordPressを重くしたくない、より柔軟にカスタマイズできるようにして独自にセキュリティを高めたいなどといったケースがあるかと思います。

そんな時に当記事の内容が非常に役立つかと思いますので、よろしければぜひお仕事でご活用いただけましたら幸いです。

当記事のセキュリティ実装コードの内容

当記事で解説するセキュリティ周りの実装コードの内容は以下になります。

  • WP REST API を無効にする
  • authorクエリの無効化
  • XML-RPCの無効化
  • WordPressバージョン情報の非表示

いずれも重要な内容になりますので、ぜひ当記事をご活用いただければと思います。

それでは、それぞれ解説していきます。

WP REST API を無効にする

rest_authentication_errorsフィルターを使って、REST APIの認証エラーをチェックし、ユーザーがログインしていない場合は401のエラーを返します。

これにより、未ログインのユーザーに対してREST APIへのアクセスを制限します。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// WP REST API を無効にする json 形式のユーザーのデータ
add_filter( 'rest_authentication_errors', function( $result ) {
  if ( ! empty( $result ) ) {
    return $result;
  }
  if ( ! is_user_logged_in() ) {
    return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
  }
  return $result;
});

rest_authentication_errorsフックについては以下のURLからご確認いただけます。

注意点としては、他サイトでこのWP REST APIを使って記事一覧を表示している場合は表示されなくなってしまうので、その点だけご注意ください。

authorクエリの無効化

独自に定義したdisable_author_archive_query関数とdisable_author_archive関数を使って、URLに含まれるauthorクエリやauthorスラッグによるアクセスを制限します。

未ログインのユーザーがauthorに関する情報を取得できないようにします。

また、authorスラッグに対するリクエストは404ページにリダイレクトされます。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// author=xxx 対策
function disable_author_archive_query() {
  if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING'])){
    wp_redirect( home_url() );
    exit;
  }
}
add_action('init', 'disable_author_archive_query');
function disable_author_archive() {
  if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI'])  && !is_user_logged_in()){
    wp_redirect( home_url('/404.php') );
    exit;
  }
}
add_action('init', 'disable_author_archive');

initフックについては以下のURLからご確認いただけます。

XML-RPCの無効化

xmlrpc_enabledフィルターを使ってXML-RPCへのアクセスを無効化します。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// XML-RPCへのアクセスを完全にブロック
add_filter( 'xmlrpc_enabled', '__return_false' );

また、xmlrpc_methodsフィルターを使ってピンバック機能を無効化します。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// XML-RPCのピンバック機能を無効化
add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['pingback.ping'] );
    return $methods;
});

これにより、XML-RPCを利用した不正なアクセスや攻撃を防止します。

以下にxmlrpc_enabledフックとxmlrpc_methodsフックについては以下のURLからご確認いただけます。

WordPressバージョン情報の非表示

wp_generatorアクションを使って、WordPressのバージョン情報を含むmetaタグを非表示にします。

これにより、攻撃者がWordPressのバージョン情報を取得することを防ぎます。

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// WordPressバージョン情報の非表示
remove_action('wp_head', 'wp_generator');

wp_headフックについては以下のURLからご確認いただけます。

まとめ

当記事では以下のセキュリティ周りの実装コードについて解説いたしました。

  • WP REST API を無効にする
  • authorクエリの無効化
  • XML-RPCの無効化
  • WordPressバージョン情報の非表示

ケースバイケースではありますが、いずれもWordPressのセキュリティを考えた場合に知っておくべき内容になりますので、ぜひ当記事を通してお仕事でお役立ていただければと思います。

念の為、全てをおまとめしたコードを添付させていただきます。

以下のコードをfunctions.phpにコピー&ペーストしてください。

/*
セキュリティ対策
*/

// WP REST API を無効にする json 形式のユーザーのデータ
add_filter( 'rest_authentication_errors', function( $result ) {
  if ( ! empty( $result ) ) {
    return $result;
  }
  if ( ! is_user_logged_in() ) {
    return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
  }
  return $result;
});

// author=xxx 対策
function disable_author_archive_query() {
  if( preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING'])){
    wp_redirect( home_url() );
    exit;
  }
}
add_action('init', 'disable_author_archive_query');
function disable_author_archive() {
  if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI'])  && !is_user_logged_in()){
    wp_redirect( home_url('/404.php') );
    exit;
  }
}
add_action('init', 'disable_author_archive');

// XML-RPCへのアクセスを完全にブロック
add_filter( 'xmlrpc_enabled', '__return_false' );

// XML-RPCのピンバック機能を無効化
add_filter( 'xmlrpc_methods', function( $methods ) {
    unset( $methods['pingback.ping'] );
    return $methods;
});

// WordPressバージョン情報の非表示
remove_action('wp_head', 'wp_generator');
執筆者

ワードプレスマガジン編集部 高澤 翔汰

歴4年目(2024年8月以降から5年目です)のエンジニアです!
CMSでのサイト構築とWebデザイン制作を兼任して4年目になります。
自作のiOSアプリ(iPhoneアプリ)やWordPressプラグインを開発することもあり、まだまだ現在進行形で勉強中です!