WordPressがheadに挿入する「api.w.org」とは。またその無効化の方法

WordPress軽量化のためムダな機能やタグを減らそうと調査した際、以下のようなタグが目につきました。

<link rel="https://api.w.org/" href="https://siteurl.com/wp-json/">

調べてみると、WordPress4.4からコアに実装された REST API を呼び出すためのコードと分かりました。

REST API とは

WordPress独自の機能ではなくWebサイトをAPI化するための汎用的な設計モデルのことを指し、ユーザーがWebサイトからデータを抜き出しやすくする仕組みです。

Webサイトから情報を抜き出しやすくすることで、外部のWebアプリケーションとの連携を取りやすくなります。

参考
https://qiita.com/masato44gm/items/dffb8281536ad321fb08
https://qiita.com/TakahiRoyte/items/949f4e88caecb02119aa

WordPressの REST API の機能

ではWordPressではどのように動くのかというと、以下のリンクをクリックしてみてください。

https://hacknote.jp/wp-json/wp/v2/posts/36229/

これは REST API でこのページのデータがjson形式で抜き出されたものです。

https://siteurl.com/wp-json/wp/v2/posts/01234 //末尾はpostID

以上のように、稼働中のWordPressのURLに wp-json/wp/v2/posts/ を含めると、その記事の情報を抜き出せます。

情報を抜き出すほか、APIの認証を通せば追加、更新、削除などの操作まで出来ます。WordPressプラグインや、WordPressと連携した外部サービスなどを開発する時に利用できるAPIです。

ですが「えっ?API機能なんてうちのサイトには要らないんだけど…」と思う人、多いと思います。私もそう思います。

REST APIのリスク

REST APIで抜き出される情報は以下のように、記事内容から設定まで、WordPress内のほとんどのデータを表示できます。

  • 記事ID
  • 作成日、更新日
  • 記事タイトル
  • 記事内容
  • 投稿者情報
  • カテゴリー情報
  • タグ情報
  • コメント情報
  • 投稿フォーマット
  • etc…

セキュリティ的に問題あるデータは出ませんが、IDの類などあまり見られたくない情報もありますし、WordPressで構築された大多数のWebサイトは記事データをAPIとして公開する意図は無いと考えられ、率直に言うと不要な機能です。

またWordPress4.7の時に世界中で話題になった改ざん被害の原因はREST APIの脆弱性です

すでに脆弱性は対策され、今後も厳しいチェックはされると考えられますが、データを読み書きできるAPIの性質上、セキュリティホールになりやすい傾向があります。

私見ですが、WebサイトをAPI化する意図が無い人には、メリットが小さくリスクは大きいアンバランスな機能だと感じます。

REST APIを安全に無効化する

REST APIを無効化するプラグインや functions.php からコード記述で無効化できますが、WordPress標準の「oEmbed」機能のほか、「Jetpack」や「Contact Form 7」など人気プラグインでREST APIが利用されているため、単純に止めてもリスクがあります。

そのため一部の機能やプラグインを除きREST APIを無効化するコードを functions.php へ追加します。

functions.php

//一部機能・プラグインを除外しREST APIを無効
function deny_restapi_except_plugins( $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', __( 'The REST API on this site has been disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_pre_dispatch', 'deny_restapi_except_plugins', 10, 3 );

上記コードではoEmbed機能と「Jetpack」「Contact Form 7」を除外しています。

他のプラグインでもREST APIが必要な場合、wp-content/plugins内のプラグインフォルダ名と同じ名前を指定することで除外することができます。

参考
コードは以下記事のものを参考にさせていただきました。
WordPress4.7 の WP REST API を無効にする