2026年5月20日
2026年5月20日
WordPressのバージョン情報を非表示にする方法
はじめに
WordPressのバージョン情報がHTMLソースやHTTPヘッダーに露出していると、攻撃者が既知の脆弱性を持つバージョンを特定し標的にできます。バージョン情報を隠すことで攻撃の難易度を上げられます。
症状・原因
- HTMLソースに
が表示されている - CSSやJSのURLに
?ver=6.x.xのクエリパラメータが付いている readme.htmlにアクセスするとWordPressバージョンが確認できる- セキュリティスキャンで「WordPressバージョンが露出しています」と指摘された
解決手順
ステップ1:現在の露出状況を確認する
# HTMLソースでジェネレータタグを確認
curl -s https://example.com/ | grep -i "generator\|wordpress"
# CSSファイルのバージョンクエリを確認
curl -s https://example.com/ | grep -oE "ver=[0-9.]+" | sort -u
# readme.html にアクセスできるか確認
curl -I https://example.com/readme.html
# 200が返る場合は削除が必要
# wp-json からバージョンを確認
curl -s https://example.com/wp-json/ | grep -o '"version":"[^"]*"'
# HTTP ヘッダーにバージョンが含まれているか確認
curl -sI https://example.com/ | grep -i "x-powered\|wordpress"
ステップ2:ジェネレータタグとバージョンクエリを除去する
// functions.php: WordPressバージョン情報を全面的に隠す
// ① HTMLのジェネレータタグを除去(<meta name="generator">)
remove_action('wp_head', 'wp_generator');
// ② フィードのジェネレータタグを除去
add_filter('the_generator', '__return_empty_string');
// ③ CSS/JSのバージョンクエリパラメータ(?ver=)を除去
add_filter('style_loader_src', function(string $src): string {
if (str_contains($src, 'ver=')) {
$src = remove_query_arg('ver', $src);
}
return $src;
}, 9999);
add_filter('script_loader_src', function(string $src): string {
if (str_contains($src, 'ver=')) {
$src = remove_query_arg('ver', $src);
}
return $src;
}, 9999);
ステップ3:readme.htmlとlicense.txtを削除・アクセス制限する
# ① readme.html を削除(WordPressバージョンが記載されている)
rm /var/www/html/readme.html
# ② license.txt を削除
rm /var/www/html/license.txt
# ③ wp-admin/about.php へのアクセスを制限(管理者のみ)
# .htaccess で外部からの直接アクセスをブロックする場合
# .htaccess: readme.html と license.txt へのアクセスをブロック
<FilesMatch "^(readme\.html|license\.txt|readme\.txt|wp-config\.php\.bak)$">
Order Deny,Allow
Deny from all
</FilesMatch>
# Nginx: 情報開示ファイルをブロック
location ~* ^/(readme\.html|license\.txt|readme\.txt)$ {
deny all;
access_log off;
}
ステップ4:REST APIのバージョン情報を隠す
// functions.php: REST API レスポンスからWordPressバージョンを除去
// ① REST API のジェネレータヘッダーを削除
remove_action('rest_api_init', 'wp_register_rest_route_generator');
// ② REST API ルートレスポンスからバージョンを除去
add_filter('rest_index_data', function(array $response): array {
unset($response['name'], $response['description'], $response['gmt_offset']);
// namespaces だけ残して詳細情報は除去
return array_intersect_key($response, array_flip(['namespaces', 'authentication', 'routes']));
});
// ③ X-Powered-By ヘッダーを削除(PHP バージョンも隠す)
add_action('send_headers', function(): void {
header_remove('X-Powered-By');
// セキュリティヘッダーを追加
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: SAMEORIGIN');
header('X-XSS-Protection: 1; mode=block');
});
ステップ5:WP-CLIでバージョン露出の最終確認を行う
# 設定後に露出が残っていないか確認
curl -s https://example.com/ | grep -i "wordpress\|generator\|ver="
# readme.html が削除されているか確認
curl -o /dev/null -s -w "%{http_code}" https://example.com/readme.html
# 404 が返れば OK
# REST API のバージョン情報確認
curl -s https://example.com/wp-json/ | python3 -m json.tool | grep -i "version\|name"
# wp-login.php のHTMLソースにバージョンが含まれないか確認
curl -s https://example.com/wp-login.php | grep -i "ver="
注意事項
?ver=クエリパラメータを除去するとブラウザキャッシュのバストができなくなります。プラグイン・テーマ更新後にキャッシュが残る場合があります。本番環境では影響を確認してから適用してくださいreadme.htmlを削除すると、WordPress更新時に再作成される場合があります。削除後は更新のたびに確認し、.htaccessでのアクセス制限を優先する方が確実です- バージョンを隠すことはセキュリティの補助手段です。WordPress・プラグインを最新版に保つことが最も重要です
まとめ
バージョン情報の非表示は①remove_action('wp_head', 'wp_generator')でメタタグ除去、②style_loader_src/script_loader_srcフィルターで?ver=クエリ削除、③readme.html・license.txtの削除または.htaccessでのアクセス制限、④REST APIレスポンスからバージョン情報を除去、⑤curl -s example.com | grep -i "wordpress"で露出確認します。