2026年5月20日

2026年5月20日

WordPressのバージョン情報を非表示にする方法|generatorタグ・ver=・readme.html

WordPress は、初期状態ではページの HTML やフィードに自分のバージョン番号を書き出します。攻撃者がこれを見て、既知の脆弱性があるバージョンかどうかを調べる手がかりにすることがあります。この記事では、バージョンが表示される場所を確認し、隠す手順を説明します。内容は2026年10月時点のものです。

最初に知っておいてほしいのは、バージョンを隠すのは補助的な対策だということです。CSS や JavaScript のファイルの中身などからバージョンを推測する方法もあるため、隠しても特定を防げるとは限りません。いちばん効くのは、WordPress 本体・プラグイン・テーマを最新に保つことです。

バージョンが表示される場所

場所 表示される内容 対処
HTML の <head> <meta name="generator" content="WordPress 6.9.4"> のようなタグ the_generator フィルター
RSS・Atom フィード <generator>https://wordpress.org/?v=6.9.4</generator> のような行 同じく the_generator フィルター
CSS・JavaScript の URL style.min.css?ver=6.9.4 のような ?ver= style_loader_src・script_loader_src フィルター
HTTP ヘッダー X-Powered-By: PHP/8.3.x(WordPress ではなく PHP のバージョン) php.ini の expose_php
readme.html WordPress を使っていること(現在の readme.html にはバージョン番号は書かれていません) アクセスを拒否する

REST API の /wp-json/ が返すサイト情報(名前・説明・URL・タイムゾーン・名前空間など)には、WordPress のバージョンは含まれていません。バージョンを隠す目的で REST API の出力を削る必要はありません。

ステップ1:今の表示状態を確認する

自分のサイトの URL に置き換えて、手元のパソコンやサーバーで実行します。キャッシュ系プラグインや CDN を使っている場合は、変更後にキャッシュを削除してから確認してください。

# HTML の generator タグ
curl -s https://example.com/ | grep -i 'name="generator"'

# フィードの generator
curl -s https://example.com/feed/ | grep -i '<generator>'

# CSS・JS に付いている ver= の値の一覧
curl -s https://example.com/ | grep -oE 'ver=[0-9][0-9.]*' | sort | uniq -c

# HTTP ヘッダーの X-Powered-By
curl -sI https://example.com/ | grep -i 'x-powered-by'

# readme.html が読めるか(200 なら読める)
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html

ver= の一覧に、管理画面の「ダッシュボード」→「更新」で表示される WordPress のバージョンと同じ値があれば、その CSS や JS から WordPress のバージョンがわかる状態です。WordPress 本体やテーマが CSS・JS を読み込むときにバージョンを指定しないと、WordPress のバージョンが ver= に入ります。

ステップ2:コードを置く場所を決める

この記事のコードは、次のどちらかに置きます。

  • mu-plugin(おすすめ):wp-content/mu-plugins/ フォルダー(なければ作る)に PHP ファイルを置くと、有効化の操作なしで読み込まれます。テーマを変えても効果が続きます
  • 子テーマの functions.php:親テーマの functions.php に書くと、テーマの更新で消えます

mu-plugin にする場合は、wp-content/mu-plugins/hide-wp-version.php のような名前で、次のステップのコードを1つのファイルにまとめて保存します。

ステップ3:generatorタグと ver= のバージョンを隠す

<?php
/**
 * Plugin Name: Hide WordPress Version
 * Description: generator タグと、CSS・JS の ver= に出る WordPress のバージョンを隠す。
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

// HTML の <meta name="generator"> と、フィードの <generator> を空にする。
add_filter( 'the_generator', '__return_empty_string' );

/**
 * CSS・JS の ver= が WordPress のバージョンと同じときだけ、別の値に置き換える。
 * ver= を消すのではなく置き換えるので、WordPress の更新後もブラウザのキャッシュが更新される。
 */
function wpdr_replace_wp_version_query( $src ) {
	if ( ! is_string( $src ) || '' === $src ) {
		return $src;
	}

	$query = wp_parse_url( $src, PHP_URL_QUERY );
	if ( empty( $query ) ) {
		return $src;
	}

	parse_str( $query, $args );
	$wp_version = get_bloginfo( 'version' );

	if ( isset( $args['ver'] ) && $args['ver'] === $wp_version ) {
		$src = add_query_arg( 'ver', substr( wp_hash( $wp_version ), 0, 10 ), $src );
	}

	return $src;
}
add_filter( 'style_loader_src', 'wpdr_replace_wp_version_query', 20 );
add_filter( 'script_loader_src', 'wpdr_replace_wp_version_query', 20 );

ポイントは次のとおりです。

  • the_generator フィルターは、HTML の generator タグとフィードの generator の両方に効きます。remove_action( 'wp_head', 'wp_generator' ); は HTML のタグだけを消すので、フィードには効きません
  • ?ver= をすべて消すと、プラグインやテーマを更新したときに、ブラウザが古い CSS・JS を使い続けることがあります。上のコードは、WordPress のバージョンと同じ値のときだけ、バージョンから作った別の文字列に置き換えます。WordPress を更新すると値も変わるので、キャッシュは更新されます
  • プラグインやテーマが独自のバージョン番号を付けている ver= は変えません

保存したら、ステップ1のコマンドで generator が出ないこと、ver= の一覧に WordPress のバージョンが残っていないことを確認します。キャッシュ系プラグインを使っている場合は、キャッシュを削除してから確認してください。

ステップ4:X-Powered-By ヘッダーを止める

X-Powered-By は WordPress ではなく PHP が付けるヘッダーで、PHP のバージョンがわかります。止めるには、PHP の設定ファイル(php.ini)で expose_php を Off にします。この設定は php.ini でしか変えられません。

expose_php = Off

VPS の Ubuntu で PHP-FPM を使っている場合の例です(8.3 は使っている PHP のバージョンに合わせます)。

# 現在の設定を確認する
grep -n '^expose_php' /etc/php/8.3/fpm/php.ini

# 書き換えたら PHP-FPM を再起動する
sudo systemctl restart php8.3-fpm

Ubuntu のパッケージの php.ini は、初期状態で expose_php = Off になっています。ヘッダーが出ている場合は、別の php.ini が使われていないか確認してください。レンタルサーバーでは、管理画面の PHP 設定で変更できる場合と、変更できない場合があります。

php.ini を変えられないときは、WordPress のコードでヘッダーを外す方法もあります。ただし send_headers は WordPress がフロント側のページを出すときに動くフックなので、管理画面やログイン画面には効きません。

add_action( 'send_headers', function () {
	header_remove( 'X-Powered-By' );
} );

ステップ5:readme.html と license.txt へのアクセスを拒否する

readme.html と license.txt は WordPress 本体のファイルです。現在の readme.html にはバージョン番号は書かれていませんが、WordPress を使っていることはわかります。

削除しても、WordPress 本体を更新すると元に戻ります。削除するより、Web サーバーでアクセスを拒否するほうが手間がかかりません。

Apache(.htaccess)の場合

WordPress のフォルダーにある .htaccess に追記します。# BEGIN WordPress と # END WordPress の間は WordPress が書き換えるので、その外に書きます。Apache 2.4 の書き方です(Order・Deny from all は Apache 2.2 の古い書き方です)。

<FilesMatch "^(readme\.html|license\.txt)$">
    Require all denied
</FilesMatch>

Nginx の場合

サイトの server ブロックに追記し、設定を確認してから読み込み直します。

location ~* ^/(readme\.html|license\.txt)$ {
    deny all;
}
sudo nginx -t && sudo systemctl reload nginx

追記後に curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html を実行し、403 が返ることを確認します。

隠しても防げないこと

  • WordPress の CSS・JS ファイルの中身はバージョンごとに少しずつ違うため、ファイルを取得して比べればバージョンを推測できます
  • プラグインやテーマの readme.txt や ver= から、プラグインのバージョンがわかることがあります。狙われやすいのは本体よりプラグインの脆弱性です
  • 管理画面にログインできる人には、バージョンは今までどおり表示されます

このため、バージョンを隠すのと合わせて、本体・プラグイン・テーマの更新、使っていないプラグインの削除、管理画面のファイル編集の無効化などを行ってください。

まとめ

  • バージョンが出るのは、HTML とフィードの generator、CSS・JS の ?ver= が主な場所。REST API の /wp-json/ には WordPress のバージョンは含まれない
  • add_filter( 'the_generator', '__return_empty_string' ); で HTML とフィードの両方の generator を消せる
  • ?ver= は消さずに、WordPress のバージョンと同じ値だけを置き換えると、キャッシュの更新を止めずに済む
  • X-Powered-By は php.ini の expose_php = Off で止める
  • readme.html は削除しても更新で戻るので、Web サーバーでアクセスを拒否する
  • 隠すのは補助的な対策で、更新を続けることがいちばん大切

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲