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.htmllicense.txtの削除または.htaccessでのアクセス制限、④REST APIレスポンスからバージョン情報を除去、⑤curl -s example.com | grep -i "wordpress"で露出確認します。

お気軽にご相談ください

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