WordPress REST APIを無効化してセキュリティを強化する

WordPress には外部からWordPressにアクセスできるようにするREST APIがあります。REST APIを使えば外部のサイトからWordPressの投稿を取得したり、記事を投稿できます。

ですが、REST APIが必要になることはほとんどなく無効化していても問題ない場合がほとんどです。また、REST APIはWordPress への攻撃にも使われることがあるため、使わないのであれば停止しておく方がセキュリティも強化できて安全です。

そこで今回は、WordPressのREST API機能を無効化する方法を紹介していきます。

目次から探す

WordPressのREST APIを無効化する方法

WordPressのREST APIはfunctions.phpに少し追記するだけで簡単に無効化できます。追記するのは以下のコードです。

function disable_rest_api() {
  return new WP_Error( 'disabled', __( 'REST API is disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_authentication_errors', 'disable_rest_api' );

こちらのコードをfunctions.phpに書き込むだけで全てのREST APIを無効化できます。

試しに「サイトURL/wp-json/wp」などREST APIのURLにアクセスしてみてください。エラーが返ってきて正常にデータを取得できなくなっているはずです。

プラグインによっては REST API を使用しているので注意

自分が直接 REST API を使うことはなくてもプラグインが使っていることがあります。

そのためREST APIへの全てのアクセスを無効化してしまうとプラグインが正常に動作せず、不具合を起こしてしまう可能性があります。

ですので、WordPress標準機能やプラグインでREST APIを使用している場合のみ、REST APIへのアクセスを許可するようにする必要があります。

そういう場合は、以下のようにしましょう。特定プラグイン・機能使用時のみREST APIを無効化しないようにするコードを記述しましょう。

function deny_restapi_except_plugins_demo( $result, $wp_rest_server, $request ){
  $namespaces = $request->get_route();

  //oembedの除外
  if( strpos( $namespaces, 'oembed/' ) === 1 ){
    return $result;
  }
  //Jetpackの除外
  if( strpos( $namespaces, 'jetpack/' ) === 1 ){
    return $result;
  }
  //Contact Form7の除外
  if( strpos( $namespaces, 'contact-form-7/' ) === 1 ){
    return $result;
  }

  return new WP_Error( 'rest_disabled', __( '' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_pre_dispatch', 'deny_restapi_except_plugins_demo', 10, 3 );

上記のコードだとoembed機能とプラグイン「JetPack・Contact Form 7」でのみREST APIが有効化されるようになっています。

ほかのプラグインでのREST APIを使えるよう状態にしておくには?

REST API無効化の除外処理はプラグインディレクトリなどのネームスペースをベースに判定しています。

ネームスペースとはプラグインエディタやテーマエディターで確認できるディレクトリ名です。

こちらの名前がネームスペースなので、PHPのif文を書ける人は好きなプラグインを除外してREST APIを使えるようにするといいでしょう。

これでWordPressのセキュリティがまた少し強化されるはずです。

目次から探す