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 サーバーでアクセスを拒否する- 隠すのは補助的な対策で、更新を続けることがいちばん大切
関連記事: