MENU

WordPress REST APIを特定の条件下のみ無効化を除外する方法

WordPressのREST APIは非常に便利ですが、必要に応じて特定の条件下のみ無効化を除外することで、柔軟な運用が可能になります。

特定のユーザーやプラグイン、時間帯、IPアドレスごとの制御は、セキュリティと利便性を両立させる重要な手段です。ここでは、条件別に実装方法と解説を示します。

目次

特定のユーザーのみ無効化を除外する

ログイン済みの管理者ユーザーや、特定の役割を持つユーザーに対してのみREST APIを有効にする方法です。

function restrict_rest_api_for_users($result) {
    if (!is_user_logged_in() || !current_user_can('administrator')) {
        return new WP_Error('rest_forbidden', 'REST APIの使用は許可されていません', array('status' => 403));
    }
    return $result;
}
add_filter('rest_authentication_errors', 'restrict_rest_api_for_users');
  • is_user_logged_in():ユーザーがログインしているかを判定
  • current_user_can('administrator'):管理者権限のユーザーをチェック
  • 権限のない場合、403エラーを返します。

難易度 

条件の判定はシンプルですが、他の権限との調整が必要な場合には注意が必要です。

特定のプラグインのみ無効化を除外する

一部のプラグインがREST APIに依存する場合、そのプラグインがアクティブな時だけAPIを有効にします。

function disable_rest_api_except_plugin($result) {
    if (!is_plugin_active('jetpack/jetpack.php')) {
        return new WP_Error('rest_disabled', 'REST APIは無効化されています', array('status' => 403));
    }
    return $result;
}
add_filter('rest_authentication_errors', 'disable_rest_api_except_plugin');
  • is_plugin_active():プラグインがアクティブかどうかを判定します。
  • jetpack/jetpack.phpの部分に対象プラグインのパスを指定します。

難易度 

プラグインのパス名が正しいか確認する必要があるため、少し手間がかかります。

アクティブな特定のプラグインのみ有効

特定のプラグインがアクティブな時にのみREST APIを有効化したい場合、プラグイン名やスラッグを使った判定が可能です。WordPressにはプラグインのアクティブ状態を確認する関数が用意されていますが、プラグイン名だけで制御する場合には少し工夫が必要です。以下に、プラグインのスラッグを使ってREST APIを除外する方法を示します。

function allow_rest_api_for_specific_plugin($result) {
    $active_plugins = get_option('active_plugins'); // アクティブなプラグインを取得
    $allowed_plugin = 'contact-form-7/wp-contact-form-7.php'; // プラグインのパス

    if (in_array($allowed_plugin, $active_plugins)) {
        return $result; // 対象プラグインがアクティブな場合、REST APIを有効化
    }
    return new WP_Error('rest_disabled', 'REST APIは無効化されています', array('status' => 403));
}
add_filter('rest_authentication_errors', 'allow_rest_api_for_specific_plugin');
  1. get_option('active_plugins'):アクティブなプラグインの一覧を取得します。
  2. $allowed_plugin:プラグインのスラッグを指定します。ここでは「Contact Form 7」のパスを例にしています。
  3. in_array():取得したプラグイン一覧に、指定したプラグインが含まれているかを判定します。
  4. WP_Error:該当プラグインがアクティブでない場合に、403エラーを返します。

難易度 

プラグイン名の正確なスラッグとパスを把握して設定する必要があり、ミスがあると意図した動作にならない可能性があります。

Q&A

プラグインのスラッグがわからない場合はどうすれば良いですか?

プラグインのスラッグは、WordPress管理画面の「プラグイン」一覧で確認できるパス名がヒントになります。

よく使われるプラグイン名のリスト

  • Contact Form 7(wp-contact-form-7)
  • Yoast SEO(wordpress-seo)
  • WooCommerce(woocommerce)
  • Jetpack(jetpack)
  • Akismet Anti-Spam(akismet/akismet.php)
  • Elementor(elementor/elementor.php)
  • All-in-One WP Migration(all-in-one-wp-migration)
  • UpdraftPlus(updraftplus/updraftplus.php)
  • WP Super Cache(wp-super-cache/wp-cache.php)

特定のプラグインがアクティブな場合にのみREST APIを有効化することで、不要なAPIアクセスを制御しつつ、必要な機能は維持できます。プラグインのスラッグに基づいて判定することがポイントで、柔軟な管理が可能です。

複数のプラグインがアクティブな場合にREST APIを有効化する方法

複数のプラグインがアクティブな場合のみREST APIを有効にし、それ以外では無効化する方法について解説します。この手法は、例えば「WooCommerce」「Elementor」「Yoast SEO」のような特定の複数プラグインを使用している際にREST APIを有効化したい場合に有効です。
array_intersect()関数を用いて、複数のプラグインがアクティブなかどうかを判定する方法を紹介します。

function allow_rest_api_for_selected_plugins($result) {
    $active_plugins = get_option('active_plugins'); // アクティブなプラグインを取得
    $allowed_plugins = array(
        'woocommerce/woocommerce.php', 
        'elementor/elementor.php', 
        'wordpress-seo/wp-seo.php'
    ); // 許可するプラグインのリスト

    // 許可プラグインのいずれかがアクティブな場合、REST APIを有効化
    if (array_intersect($allowed_plugins, $active_plugins)) {
        return $result;
    }

    // それ以外の場合、REST APIを無効化し403エラーを返す
    return new WP_Error(
        'rest_disabled', 
        'REST APIは無効化されています', 
        array('status' => 403)
    );
}
add_filter('rest_authentication_errors', 'allow_rest_api_for_selected_plugins');
  1. get_option('active_plugins'):現在有効化されているプラグインの一覧を取得します。
  2. $allowed_plugins:REST APIの利用を許可するプラグインを配列で定義します。この例では「WooCommerce」「Elementor」「Yoast SEO」の3つのプラグインが対象です。
  3. array_intersect():指定したプラグインとアクティブなプラグインの一覧を比較し、一致するプラグインがあるかどうかを判定します。
  4. WP_Error:条件に合致しない場合は、403エラーでREST APIを無効化します。

難易度 

  • 配列操作や条件分岐が必要なため、PHPに慣れていないユーザーには少し複雑かもしれません。
  • 使用するプラグインのスラッグ(パス名)を正確に把握する必要があり、間違うと期待通りに動作しません。

Q&A

スラッグを間違えた場合、どうなりますか?

スラッグが正しくないと、プラグインがアクティブであっても無効化されるため、期待通りにREST APIが動作しません。プラグインのスラッグは「プラグイン」一覧画面で確認するか、FTPでプラグインのフォルダ名を調べてください。

新しいプラグインを追加する場合はどうすればいいですか?

$allowed_plugins配列に追加したいプラグインのスラッグを追記するだけで対応可能です。

全てのプラグインが無効な場合、どうなりますか?

上記のコードでは、指定したプラグインが1つもアクティブでない場合、REST APIは無効化されます。

特定の複数のプラグインがアクティブな場合にのみREST APIを有効化することで、不要なアクセスを制限しつつ必要な機能を維持することができます。この手法は、WooCommerceやElementorなどのAPI依存のプラグインを安全に管理するのに便利です。

特定の時間帯のみ無効化を除外する

夜間やメンテナンス時間帯など、特定の時間帯だけAPIを無効化するケースです。

function restrict_rest_api_by_time($result) {
    $current_hour = date('H');
    if ($current_hour >= 0 && $current_hour < 6) { // 深夜0時から6時
        return new WP_Error('rest_disabled', 'この時間帯はAPIが無効化されています', array('status' => 403));
    }
    return $result;
}
add_filter('rest_authentication_errors', 'restrict_rest_api_by_time');
  • date('H')で現在の時間を取得します。
  • 午前0時から6時の間はAPIを無効化します。

難易度 

日時の管理はシンプルですが、サーバーのタイムゾーン設定に注意が必要です。

特定のIPアドレスのみ無効化を除外する

特定の信頼できるIPアドレスからのアクセスのみAPIを許可する場合に有効です。

function restrict_rest_api_by_ip($result) {
    $allowed_ips = array('123.45.67.89', '98.76.54.32');
    if (!in_array($_SERVER['REMOTE_ADDR'], $allowed_ips)) {
        return new WP_Error('rest_disabled', 'このIPアドレスではAPIを使用できません', array('status' => 403));
    }
    return $result;
}
add_filter('rest_authentication_errors', 'restrict_rest_api_by_ip');
  • $_SERVER['REMOTE_ADDR']でリクエスト元のIPを取得します。
  • in_array()で許可されたIPと照合します。

難易度 

IPアドレスの管理や、動的IPの場合の対応が少し面倒です。

特定のエンドポイントのみ無効化を除外する

必要なエンドポイントだけ有効にして、それ以外はすべて無効化する方法です。

function restrict_rest_api_by_endpoint($result) {
    $allowed_endpoints = array('/wp/v2/posts', '/wp/v2/pages');
    $requested_route = $_SERVER['REQUEST_URI'];
    foreach ($allowed_endpoints as $endpoint) {
        if (strpos($requested_route, $endpoint) !== false) {
            return $result;
        }
    }
    return new WP_Error('rest_disabled', 'このエンドポイントは無効化されています', array('status' => 403));
}
add_filter('rest_authentication_errors', 'restrict_rest_api_by_endpoint');
  • $_SERVER['REQUEST_URI']でリクエストされたエンドポイントを取得します。
  • strpos()で特定のエンドポイントを含むか判定します。

難易度 

複数のエンドポイントを細かく管理する必要があり、設定ミスに注意が必要です。

Q&A

すべてのAPIアクセスを無効化しても問題ありませんか?

サイトでプラグインやテーマがREST APIを利用している場合、無効化により機能が停止することがあります。必要なエンドポイントだけ有効にしましょう。

REST APIを無効化した後、Jetpackが使えなくなりました。どうすれば良いですか?

JetpackはREST APIに依存しています。Jetpackのエンドポイントだけを除外する設定をしてください。

まとめ

WordPressのREST APIは便利ですが、必要な場合にのみアクセスを許可することでセキュリティを高めることが可能です。

特定の条件下でのみAPIを有効化することで、攻撃リスクを軽減し、サイトの安定性を向上させます。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

WordPress Love! 休日はほぼWordPress仲間と一緒に勉強会や写真を撮りに行っています。現在育児中のため、オフが多いです(>△<<<)

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次