SP用メニューボタン
ソレゾレブログ

技術的な事だったり日常の気になる事だったり

WordPressのヘッダーに標準で挿入される情報の中で不要なものを削除(非表示)にする方法

スポンサーリンク

WordPressのセキュリティ対策には様々なものがありますが、ここではWordpressのヘッダーに標準で挿入される情報の中で不要なものを削除(非表示)してセキュリティ度を高める方法について記載していきたいと思います。

この件の概要と、Wordpressで有効なセキュリティの一覧については下記ブログに一覧にしてまとめておりますので、気になる方は参照してみてください。

DNSプリフェッチ

DNSプリフェッチとは、自分が知らない外部のドメイン名の名前解決を事前に行っておくことです。

この機能が必要なケースは、画像, 動画, スクリプト等々を様々な外部ドメインサイトから大量に読み込む必要のある場合です。

通常は、読み込み処理が発生してから名前解決を行うのですが、大量に外部サイトからのコンテンツ読み込みが発生すると、名前解決だけでとても多い処理が発生しWebサイトの表示が遅くなってしまう為、それなら読み込み処理が発生する前に名前解決はやっておこうという技術です。

このコードを挿入しているのはwp_resource_hints()関数で、Wordpress4.6でこの関数が追加されたようです。

wp_resource_hints()関数は、Webサイトへの事前フェッチ、事前レンダリング、および事前接続のために、リソースヒントをブラウザーに出力してくれます。

詳しくは下記サイトに記載があります。

大量のコンテンツを外部から読み込む必要が無い場合は非表示にしてしまって良いです。

DNSプリフェッチに関する情報は下記の部分になります。環境によって違うようですが、私の環境ではこの2行が出力されていました。

<link rel='dns-prefetch' href='//s.w.org' />
<link rel='dns-prefetch' href='//cdnjs.cloudflare.com' />

非表示にするには、「function.php」に下記のように追記すればOKです。

add_filter('wp_resource_hints', 'remove_dns_prefetch', 10, 2);
function remove_dns_prefetch($hints, $relation_type)
{
    if ('dns-prefetch' === $relation_type) {
        return array_diff(wp_dependencies_unique_hosts(), $hints);
    }
    return $hints;
}

スポンサーリンク

Windows Live Writer

Windows Live Writerとは、マイクロソフトが開発したブログの投稿や編集を行うアプリケーションです。現在はサポート切れとなっていて、後継のOpen Live Writerがオープンソフトウェアとして出回っているようです。

このOpen Live Writerには、WordPressへ直接ブログ投稿が出来る機能があるそうで、その接続のためのヘッダーです。

Open Live Writerでのブログ編集を行わない場合は非表示にして良いです。

下記が対象のヘッダー情報です。

<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://サイトのドメイン名/wp-includes/wlwmanifest.xml" /> 

非表示にするには、「function.php」に下記のように追記すればOKです。

remove_action('wp_head', 'wlwmanifest_link');

XML-RPC

XML-RPCとは、RPC(遠隔手続き呼出し)プロトコルの一種で、ネットワーク上に接続された異なるシステム間で一方からほかのシステムのプログラムを呼び出し、実行させるための手法です。

XML-RPCでは、XML形式のデータをHTTPプロトコルで転送します。

WordPressのモバイルアプリやJetpackなどで使われていたようですが、現在はそれに代わる新しいREST APIという機能が組み込まれたので、XML-RPCはあまり使われなくなってきているようです。

また、この機能にはピンバック機能を悪用するDDoS攻撃や、ブルートフォースアタックの脆弱性が発見されているため、使用している機能が無ければ無効にすべき機能です。

そもそもピンバック機能がわからない方は、下記サイトがわかりやすいと思います。

下記が対象のヘッダー情報です。

<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://サイトのドメイン名/xmlrpc.php?rsd" />

非表示にするには、「function.php」に下記のように追記すればOKです。

remove_action('wp_head', 'rsd_link');

尚、これだけではXML-RPCのAPIに接続するためにURLをヘッダ表示から非表示にしただけで、実は接続は出来ます。試しに、「https://ドメイン名/xmlrpc.php」にアクセスすると「XML-RPC server accepts POST requests only.」と表示されます。これは動いている証拠です。

無効化するには「.htaccess」ファイルに下記のように設定します。「.htaccess」ファイルはWordpressのインストールディレクトリーのルートにあります。

<Files xmlrpc.php>
Order Deny,Allow
Deny from All
</Files>

設定がうまくいくと、「Forbidden」「You don’t have permission to access this resource.」と表示されます。

ちなみに上記はApacheサーバーの設定例で、nginxのサーバーで設定してもうまくいきません。なぜならnginxでは 「.htaccess」ファイル が使えないからです。ただ例外で使える場合もあります。詳しくは「htaccessファイルについての記事を参照してください。

絵文字

WordPress4.2からは絵文字の表示に対応しています。絵文字を使わない場合は消して問題ありません。

下記が対象のヘッダー情報です。

<script type="text/javascript">
	window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/サイトのドメイン名\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.8"}};
	!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode;p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0);e=i.toDataURL();return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(!p||!p.fillText)return!1;switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([10084,65039,8205,55357,56613],[10084,65039,8203,55357,56613])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(n=t.source||{}).concatemoji?c(n.concatemoji):n.wpemoji&&n.twemoji&&(c(n.twemoji),c(n.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<style type="text/css">
	img.wp-smiley,
	img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 .07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
</style>

非表示にするには、「function.php」に下記のように追記すればOKです。

remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');

oEmbed

oEmbedとは、URLコードを埋め込むと表示用のコードを自動取得して来て、コードに埋め込んでくれるシステム規格のことです。 youtubeを埋め込んだ方はわかると思いますが、指定されたURLを埋め込むとYoutubeをWebサイトに表示させるためのコードを取得して表示してくれる、あれです。Youtubeに限らずtwitterやfacebookなどのブログカードなどにも幅広く使われている技術です。

普段は便利な機能ですが、例えばURLだけ表示させたいなどの場面では、非常に邪魔な機能となります。そういった場合は無効にすることが出来ます。

また、ヘッダーに追加されるoEmbedのエンドポイントにアクセスすると管理者のログインIDが「author_name」に表示され、良くありません。

下記が対象のヘッダー情報です。

<link rel="alternate" type="application/json+oembed" href="https://サイトのドメイン名/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fサイトのドメイン名%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://サイトのドメイン名/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fサイトのドメイン名%2F&format=xml" />

自サイト(自分のサイトの投稿)のoEmbedだけを無効にするなら、「function.php」に下記のように追記すればOKです。外部サイトのoEmbed表示は許可されます。

remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_oembed_add_host_js');

全てのoEmbedを無効にするなら「function.php」に下記のように追記すればOKです。

remove_filter('the_content', array($wp_embed, 'autoembed'), 8);

ただし、エディタの編集画面ではoEmbed表示されてしまうようです。これは調べた限りではどうしようも無さそうです。ちょっと不便ですね。

尚、プラグインでも変更できるものがあります。下記ブログを参照してください。

スポンサーリンク

WordPressバージョン情報

初期値では、Wordpressのバージョン情報がヘッダに記載されます。バージョンをヘッダに表示させるメリットはほとんど考えられないので非表示にしてよいと思われます。

下記が対象のヘッダー情報です。

<meta name="generator" content="WordPress 5.8" />

「function.php」に下記のように追記すればOKです。

remove_action('wp_head', 'wp_generator');

ショートリンク

長くなってしまったURLに別の短いURLを設定することが出来る機能です。一般的なサイトでは使うことはまずないので無効にしてよい機能です。

下記が対象のヘッダー情報です。

<link rel='shortlink' href='https://サイトのドメイン名/' />

「function.php」に下記のように追記すればOKです。

remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );

スポンサーリンク

REST API

RESTとは、公開されたWebサービスのURLにHTTPメソッドでアクセスすることで、投稿情報を取得変更したり、設定変更したりできる機能です。APIとは、その機能を提供するインタフェースの事です。

REST APIのヘッダ情報が出力されている場合はセキュリティ上よろしくないので、非表示にした方が良いかもしれません。

REST APIの接続URLを非表示にする方法

下記が対象のヘッダー情報です。

<link rel="https://api.w.org/" href="https://サイトのドメイン/wp-json/">

「function.php」に下記のように追記すればOKです。

remove_action('template_redirect', 'rest_output_link_header', 11);

REST APIを無効に方法

ヘッダ情報が表示されなくなってもREST APIは稼働したままとなりますので、URLがわかっていれば接続できてしまいます。

REST APIの機能を使うと、例えば「https://ドメイン名/wp-json/wp/v2/users」にアクセスると、ユーザーのログインID が含まれた結果が返されてしまいます。

どの機能でも完全にREST APIを使っていないことがわかっているようでしたら、機能自体を無効にしても良いかもしれません。

ただ、有名なプラグインがREST APIを使用していることがよくあるので、全体的に無効にするのはきちんと使っていない機能が無いか確認してからにしましょう。下記はREST APIを使っているプラグインの例です。

  • oembed
  • contact-form-7
  • akismet

下記がそのコードです。

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' );

設定後「https://ドメイン/wp-json」にアクセスすると、「{“code”:”disabled”,”message”:”REST API is disabled.”,”data”:{“status”:403}}」とだけ表示されます。「REST API is disabled.」をという文字列はメッセージなので自由に変更可能です。

REST APIの無効化を機能毎に除外する方法

REST APIを使っている機能やプラグインがあるなら、部分的に無効化を除外(手動でもプラグインでも)することが出来ます。プラグインで有名なのは「SiteGuard」です。「SiteGuard」の設定方法は下記ブログを参照してください。

手動の設定方法については下記のサイトを参考にしてみてください。