WordPress: head内の<meta name=”generator”> を削除するまたは偽装する

WordPressで生成されたWebページのheadタグを見ると、メタタグにWordPressのバージョンが記述されています。
必要ない気がしますね。
削除しましょう。

meta generatorとは

metaタグのname属性にgeneratorを指定すると、ページを作成したソフトウェアを明示することができます。

WordPressはデフォルトで次のようなタグをhead内に出力してくれます。

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

これを見ると、WordPressの5.9.2でページが生成されてことが一目瞭然ですね。

だから何?という話ですね。

WordPressは脆弱性が指摘されるたびにバージョンアップを繰り返してきた経緯があります。
WordPressというだけで不正アクセスしてくる愚か者がいるのに、バージョンまで明示するのは自殺行為ですね。

そこでサクッと削除しておきます。

ただし実際にはこのタグがなくても、愚か者は「WordPressの可能性がある」だけでムダなアクセスを垂れ流してくれます。
もしかしたらgeneratorとして別の名前を指定しておくと、「WordPressの可能性がない」と判断してくれるかもしれません。

ということで、generatorを偽装する方法もお伝えします。

WordPressはリンク先に「wp-includes」や「wp-content」が含まれてるなど、一目でわかる特徴が盛りだくさんです。なので、偽装しても意味がないかもしれません。
ないんだろうなぁ・・・

meta generatorを削除

まずは削除する方法から。
wp_headアクションから、wp_generator関数を除外します。

次のコードをfunction.phpか自作プラグインに記述します。

  • remove_action('wp_head', 'wp_generator');
AFFS Simple Code Viewer
Copy

この他にthe_generatorフィルターに__return_null関数を追加する方法があります。

  • add_filter( 'the_generator', '__return_null' );
AFFS Simple Code Viewer
Copy

the_generatorフィルターは次のような経路で呼ばれます。

wp_headアクション → wp_generator関数 → the_generator関数 → the_generatorフィルター

そのためwp_headアクションから、wp_generator関数を除外する最初のコードの方が効率がいいです。

ですが、the_generator関数はWebページだけでなくrssやatomなどでも呼び出され、WordPressで生成されたことを明示する情報を生成します。
これらも削除するなら、二つ目のコードを実行しておく必要があります。

両方のコードを記述しておくのが無難かもしれません。

meta generatorを偽装

Webページのhead内に生成されるgeneratorを偽装するだけなら、次のコードのようにwp_headアクションからwp_generator関数を削除したあと、metaタグを出力する関数を追加します。

  • function my_generator(){
  • echo '<meta name="generator" content="MyBlogPress 1.0.0" />';
  • }
  • remove_action( 'wp_head' , 'wp_generator');
  • add_action( 'wp_head' , 'my_generator');
AFFS Simple Code Viewer
Copy

rssなども対応させたいときは、the_generatorフィルターで個別に情報を生成していく必要があります。

  • function my_get_generator( $generator , $type ){
  • $content = 'MyBlogPress';
  • $version = '1';
  • $uri = 'https://localhost';
  • $content_version = $content . ' ' . $version;
  • switch ( $type ) {
  • case 'html':
  • $generator = '<meta name="generator" content="' . esc_attr($content_version) .'" >';
  • break;
  • case 'xhtml':
  • $generator = '<meta name="generator" content="' . esc_attr($content_version) . '" />';
  • break;
  • case 'atom':
  • $generator = '<generator uri="'.esc_url_raw($uri ).'" version="' . esc_attr($version) . '">' . esc_attr($content) .'</generator>';
  • break;
  • case 'rss2':
  • $generator = '<generator>' . $content . '</generator>';
  • break;
  • case 'rdf':
  • $generator = '<admin:generatorAgent rdf:resource="' . esc_url_raw( $uri ) . '" />';
  • break;
  • case 'comment':
  • $generator = '<!-- generator="'. esc_attr($content) . '/' . esc_attr($version) .'" -->';
  • break;
  • case 'export':
  • $generator = '<!-- generator="'. esc_attr($content) . '/' . esc_attr($version) . '" created="' . gmdate( 'Y-m-d H:i' ) . '" -->';
  • break;
  • default:
  • $generator = '';
  • }
  • return $generator;
  • }
  • add_filter( 'the_generator', 'my_get_generator' ,10 , 2);
AFFS Simple Code Viewer
Copy

rss2とかrdfとか様々タイプがあります。
いくつかはuriを指定していますが、無理やり'https://localhost'を使用しています。
いいのか悪いのかはわかりません(汗

もしかしたらWebページの他は空文字でいいかもしれないので、適宜判断してください。

なおwp_head経由でthe_generatorフィルターが呼び出されるとき、引数の$typeは'xhtml'になります。
これだけは、値を返しましょう。