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: .htaccess, Nginx і functions.php
- Як обмежити доступ до REST API WordPress
- Вимкнення редактора файлів тем і плагінів у WordPress: DISALLOW_FILE_EDIT
Маєте запитання щодо WordPress? Видавець сайту перебуває в Японії й відповідає японською. Написати нам (японською)