早速本題
前フリ無しでコードに飛びたい方は、こちらをクリックしてください。
えっとですね? お名前ドットコムサーバーで、月に一回セキュリティチェックを(有料で)やってるわけですが。
致命的な問題はなくとも、改善できる隙があるなら、埋めたいじゃあないですか?
その中の一つが、「REST APIの無効化」。
最初は僕も、色々調べてみて、「REST APIを全面的に無効にする手段」は見つけました。
ただ、気付いたんですよね。
どうやら、プラグインのうち、
- Jetpack(アクセス解析)
- Google SiteKit(同じくアクセス解析)
- MonsterInsights(やはりアクセス解析)
- Contact Form7(メールフォーム)
この3つは、REST APIを使っている模様。
ドツボ!?
実際、完全にREST APIを無効にすると、管理画面で各種解析が出ない。
ってことは、例外を加えなければならないわけですが……ハテ? さっぱりわからんちん!
ええい! こちとらド文系なんじゃい! PHPのコーディングなんか分かるか!
もそっと、コピペ一発でなんとかならんか!?
ドツボか!? と思ったのですが、ハタと思いつきました。
そうだよ! こういう時こそ、課金しているGoogleGeminiじゃあないか!
ってことで、「いい感じにコーディングして?」と、お願いしてみました。
肝心のコード!
で。肝心のコードがこちら。
(2025年12月8日修正:MonsterInsightsを含めたバージョンにしました)
/**
* REST APIを無効化(Jetpack, Site Kit, MonsterInsights, contact fprm7, ログインユーザーは除外)
*/
function my_disable_rest_api_except_plugins( $result ) {
// すでにエラーが発生している場合はそのまま返す
if ( ! empty( $result ) ) {
return $result;
}
// 1. ログインユーザーは許可する
if ( is_user_logged_in() ) {
return $result;
}
// 現在アクセスされているREST APIのルート(パス)を取得
$route = empty( $GLOBALS['wp']->query_vars['rest_route'] ) ? '' : $GLOBALS['wp']->query_vars['rest_route'];
// 2. 許可する名前空間(プラグインごとの識別子)のリスト
$whitelist = array(
'jetpack', // Jetpack用
'google-site-kit', // Google Site Kit用
'monsterinsights', // MonsterInsights用
'contact-form-7', // contact form7用
);
// ホワイトリストに含まれる文字列がルートに含まれているかチェック
foreach ( $whitelist as $plugin_namespace ) {
if ( strpos( $route, '/' . $plugin_namespace . '/' ) !== false ) {
return $result; // 許可リストにあるのでアクセスを許可
}
}
// 3. 上記以外はエラー(アクセス拒否)を返す
return new WP_Error( 'rest_forbidden', 'REST API is disabled for security.', array( 'status' => 401 ) );
}
add_filter( 'rest_authentication_errors', 'my_disable_rest_api_except_plugins' );
使い方としては、“function.php”に追記する形になります。
使用テーマがCocoonの場合、管理画面の「外観」から、「テーマファイルエディタ」を開き。
子テーマの”function.php”に追記してください。
僕の方でも、動作確認は取りました。
やあ、課金した甲斐があろうというものです。
皆様のお役に立てば幸いです。
んじゃまた。
コメント