WordPressで構築しているサイトをセキュリティ診断したところ、リスクレベルはないもののバージョン情報を隠蔽することを推奨されました。
非表示にするもの
functions.phpに記述することでWordPressのバージョンを非表示にすることができます。
metaタグのgenerarator
remove_action('wp_head', 'wp_generator');
RSSのgenerarator
function remove_rss_version() {
return '';
}
add_filter('the_generator', 'remove_rss_version');
そのほか、wp-links-opml.phpにアクセスするとバージョン情報が表示されるので、このファイルは削除やアクセス制限などをするといいかもしれません。
CSSやJavaScript等に付与されるバージョン情報
WordPressではCSSやJavaScriptの読み込む時にバージョン情報が自動で付与されます。
例
<link rel='stylesheet' id='wp-block-library-css' href='https://example.com/wp-includes/css/dist/block-library/style.min.css?ver=6.4.1' type='text/css' media='all' />
非表示にするには
function remove_version_scripts_styles($src) {
if (strpos($src, 'ver=')) {
$src = remove_query_arg('ver', $src);
}
return $src;
}
add_filter('style_loader_src', 'remove_version_scripts_styles', 9999);
add_filter('script_loader_src', 'remove_version_scripts_styles', 9999);
ただ、CSSやJSに付与されているバージョン情報はキャッシュ対策にもなっていると思うので、非表示でいいのか?という疑問もあります。
バージョン情報を何かに差し替える
バージョン情報 6.4.1
部分をこれを元に何かに差し替えてみれば、キャッシュ対策にもなるのではないかと思いました。
例えばchr関数を使って数値を英字にする
function changeNumberToAlphabet($text)
{
if (is_numeric($text)) {
$text = (int) $text;
return chr($text + 97); // 97を足して小文字の英字にする
} else {
return chr(ord($text));
}
}
function remove_version_scripts_styles($src)
{
if (strpos($src, 'ver=')) {
// バージョン情報の取得
$parameter = parse_url($src)['query'];
parse_str($parameter, $queries);
$version_str = $queries['ver'];
$version_str = str_replace('.', '', $version_str); // ドットの削除
$version_arr = str_split($version_str);
// バージョン情報の数字を英数字にする
$version_str = '';
foreach ($version_arr as $text) {
$version_str .= changeNumberToAlphabet($text);
}
// verのパラメータを削除
$src = remove_query_arg('ver', $src);
// 新たにverのパラメータを追加
$src = add_query_arg('ver', $version_str, $src);
}
return $src;
}
add_filter('style_loader_src', 'remove_version_scripts_styles', 9999);
add_filter('script_loader_src', 'remove_version_scripts_styles', 9999);
参考記事