2026年11月12日

2026年11月12日

Як приховати версію WordPress: тег generator, ver= і readme.html

Ця стаття — локалізована версія японського оригіналу. Читати японський оригінал

Відразу після встановлення WordPress записує свій номер версії в HTML сторінок і в стрічки. Зловмисник може скористатися цим, щоб з’ясувати, чи є в цій версії відомі вразливості. У цій статті описано, де показується версія, і як її приховати. Інформація актуальна станом на жовтень 2026 року.

Насамперед запам’ятайте: приховування версії — лише допоміжний захід. Версію можна здогадатися й за вмістом файлів CSS та JavaScript, тож приховування не гарантує, що її не визначать. Найефективніше — підтримувати в актуальному стані ядро WordPress, плагіни й теми.

Де показується версія

Місце Що показується Що робити
<head> в HTML Тег на кшталт <meta name="generator" content="WordPress 6.9.4"> Фільтр the_generator
Стрічки RSS і Atom Рядок на кшталт <generator>https://wordpress.org/?v=6.9.4</generator> Так само фільтр the_generator
URL у CSS і JavaScript ?ver=, наприклад style.min.css?ver=6.9.4 Фільтри style_loader_src і script_loader_src
HTTP-заголовки X-Powered-By: PHP/8.3.x (версія PHP, а не WordPress) expose_php у php.ini
readme.html Те, що ви користуєтеся WordPress (у сучасному readme.html номера версії немає) Заборонити доступ

Відомості про сайт, які повертає /wp-json/ REST API (назва, опис, URL, часовий пояс, простори імен тощо), не містять версії WordPress. Урізати вивід REST API, щоб приховати версію, не потрібно.

Крок 1. Перевірте, що показується зараз

Замініть URL на адресу свого сайту й виконайте команди на своєму комп’ютері або на сервері. Якщо ви користуєтеся плагінами кешування чи CDN, після змін очистьте кеш і лише тоді перевіряйте.

# Тег generator в HTML
curl -s https://example.com/ | grep -i 'name="generator"'

# generator у стрічці
curl -s https://example.com/feed/ | grep -i '<generator>'

# Перелік значень ver= у CSS і JS
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 у адмінці в розділі «Консоль» (Dashboard) → «Оновлення» (Updates), то за цими CSS чи JS можна дізнатися версію WordPress. Якщо ядро WordPress або тема підключають CSS і JS без вказівки версії, у ver= потрапляє версія WordPress.

Крок 2. Виберіть, куди помістити код

Код із цієї статті розмістіть в одному з двох місць.

  • mu-plugin (рекомендовано): якщо покласти PHP-файл у каталог wp-content/mu-plugins/ (створіть його, якщо його немає), він підключається без активації. Ефект зберігається і після зміни теми
  • functions.php дочірньої теми: якщо записати в functions.php батьківської теми, зміни зникнуть під час оновлення теми

Якщо обираєте mu-plugin, збережіть код з наступного кроку в одному файлі з назвою на кшталт wp-content/mu-plugins/hide-wp-version.php.

Крок 3. Приховайте версію в тегу generator і в ver=

<?php
/**
 * Plugin Name: Hide WordPress Version
 * Description: Приховує версію WordPress у тезі generator і в ver= у CSS та JS.
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

// Робить порожніми <meta name="generator"> в HTML і <generator> у стрічці.
add_filter( 'the_generator', '__return_empty_string' );

/**
 * Замінює ver= у CSS і JS іншим значенням лише тоді, коли воно збігається з версією WordPress.
 * Значення не видаляється, а замінюється, тому після оновлення 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 діє і на тег generator в HTML, і на 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

Приклад для Ubuntu на VPS із PHP-FPM (8.3 підставте відповідно до своєї версії PHP).

# Перевірити поточне налаштування
grep -n '^expose_php' /etc/php/8.3/fpm/php.ini

# Після зміни перезапустити PHP-FPM
sudo systemctl restart php8.3-fpm

У php.ini з пакета Ubuntu за замовчуванням уже стоїть 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 вони повернуться. Заборонити доступ на боці вебсервера простіше, ніж видаляти.

Для Apache (.htaccess)

Додайте в кінець .htaccess у каталозі WordPress. Вміст між # 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.

Від чого приховування не захищає

  • Вміст файлів CSS і JS у WordPress трохи відрізняється в різних версіях, тому, завантаживши файли й порівнявши їх, версію можна здогадатися
  • За readme.txt або ver= плагінів і тем іноді можна дізнатися версії плагінів. Зловмисників частіше приваблюють вразливості плагінів, а не ядра
  • Тим, хто може ввійти в адмінку, версія показується, як і раніше

Тому разом із приховуванням версії оновлюйте ядро, плагіни й теми, видаляйте плагіни, якими не користуєтеся, і вимикайте редагування файлів в адмінці.

Підсумок

  • Версія показується переважно в generator в HTML і стрічках та в ?ver= у CSS і JS. REST API /wp-json/ версії WordPress не містить
  • За допомогою add_filter( 'the_generator', '__return_empty_string' ); можна прибрати generator і в HTML, і в стрічках
  • Не прибирайте ?ver= повністю, а замінюйте лише значення, що збігається з версією WordPress, — так оновлення кешу не припиняється
  • X-Powered-By вимикається через expose_php = Off у php.ini
  • Навіть якщо видалити readme.html, оновлення поверне його, тож забороніть доступ на боці вебсервера
  • Приховування — допоміжний захід; найважливіше — продовжувати оновлення

Пов’язані статті:

Маєте запитання щодо WordPress? Видавець сайту перебуває в Японії й відповідає японською. Написати нам (японською)

お気軽にご相談ください

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