2026年11月12日
2026年11月12日
Cara Menyembunyikan Versi WordPress: Tag generator, ver=, readme.html
Artikel ini adalah edisi lokal dari artikel asli berbahasa Jepang. Baca artikel asli berbahasa Jepang
Pada kondisi awal, WordPress menuliskan nomor versinya sendiri di HTML halaman dan di feed. Penyerang kadang memanfaatkannya sebagai petunjuk untuk memeriksa apakah versi tersebut memiliki kerentanan yang sudah diketahui. Artikel ini menjelaskan tempat-tempat versi ditampilkan dan cara menyembunyikannya. Isinya per Oktober 2026.
Hal pertama yang perlu Anda ketahui: menyembunyikan versi hanyalah langkah pendukung. Karena versi masih bisa diperkirakan dari isi file CSS dan JavaScript, menyembunyikannya belum tentu mencegah identifikasi. Yang paling efektif adalah menjaga inti WordPress, plugin, dan tema tetap yang terbaru.
Tempat versi ditampilkan
| Lokasi | Yang ditampilkan | Penanganan |
|---|---|---|
<head> HTML |
Tag seperti <meta name="generator" content="WordPress 6.9.4"> |
Filter the_generator |
| Feed RSS dan Atom | Baris seperti <generator>https://wordpress.org/?v=6.9.4</generator> |
Sama, filter the_generator |
| URL CSS dan JavaScript | ?ver= seperti pada style.min.css?ver=6.9.4 |
Filter style_loader_src dan script_loader_src |
| Header HTTP | X-Powered-By: PHP/8.3.x (versi PHP, bukan WordPress) |
expose_php di php.ini |
readme.html |
Menunjukkan bahwa situs memakai WordPress (readme.html saat ini tidak memuat nomor versi) | Tolak akses |
Informasi situs yang dikembalikan oleh /wp-json/ pada REST API (nama, deskripsi, URL, zona waktu, namespace, dan sebagainya) tidak memuat versi WordPress. Anda tidak perlu mengurangi keluaran REST API untuk tujuan menyembunyikan versi.
Langkah 1: Periksa kondisi tampilan saat ini
Ganti dengan URL situs Anda sendiri, lalu jalankan di komputer atau server Anda. Jika memakai plugin cache atau CDN, hapus cache setelah perubahan sebelum memeriksa.
# Tag generator di HTML
curl -s https://example.com/ | grep -i 'name="generator"'
# Generator di feed
curl -s https://example.com/feed/ | grep -i '<generator>'
# Daftar nilai ver= pada CSS dan JS
curl -s https://example.com/ | grep -oE 'ver=[0-9][0-9.]*' | sort | uniq -c
# X-Powered-By pada header HTTP
curl -sI https://example.com/ | grep -i 'x-powered-by'
# Apakah readme.html bisa dibaca (jika 200, berarti bisa dibaca)
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html
Jika di daftar ver= ada nilai yang sama dengan versi WordPress yang ditampilkan di "Dasbor" (Dashboard) → "Pembaruan" (Updates) pada layar admin, berarti versi WordPress bisa diketahui dari CSS atau JS tersebut. Jika inti WordPress atau tema tidak menentukan versi saat memuat CSS dan JS, versi WordPress masuk ke ver=.
Langkah 2: Tentukan tempat meletakkan kode
Letakkan kode dalam artikel ini di salah satu dari berikut.
- mu-plugin (disarankan): jika file PHP diletakkan di folder
wp-content/mu-plugins/(buat jika belum ada), file itu dimuat tanpa perlu diaktifkan. Efeknya tetap berlaku meskipun tema diganti - functions.php child theme: jika ditulis di functions.php tema induk, kode akan hilang saat tema diperbarui
Jika memakai mu-plugin, gabungkan kode pada langkah berikutnya menjadi satu file dengan nama seperti wp-content/mu-plugins/hide-wp-version.php, lalu simpan.
Langkah 3: Sembunyikan versi pada tag generator dan ver=
<?php
/**
* Plugin Name: Hide WordPress Version
* Description: Menyembunyikan versi WordPress yang muncul di tag generator serta ver= pada CSS dan JS.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// Mengosongkan <meta name="generator"> di HTML dan <generator> di feed.
add_filter( 'the_generator', '__return_empty_string' );
/**
* Hanya jika ver= pada CSS dan JS sama dengan versi WordPress, ganti dengan nilai lain.
* ver= tidak dihapus melainkan diganti, sehingga cache browser tetap diperbarui setelah WordPress diperbarui.
*/
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 );
Poin pentingnya adalah sebagai berikut.
- Filter
the_generatorberlaku untuk tag generator di HTML sekaligus generator di feed.remove_action( 'wp_head', 'wp_generator' );hanya menghapus tag di HTML, sehingga tidak berpengaruh pada feed - Jika semua
?ver=dihapus, browser bisa terus memakai CSS dan JS lama saat Anda memperbarui plugin atau tema. Kode di atas hanya mengganti nilai yang sama dengan versi WordPress menjadi string lain yang dibuat dari versi tersebut. Saat WordPress diperbarui, nilainya ikut berubah, sehingga cache diperbarui ver=dengan nomor versi milik plugin atau tema tidak diubah
Setelah disimpan, pastikan dengan perintah pada Langkah 1 bahwa generator tidak muncul dan versi WordPress tidak tersisa di daftar ver=. Jika memakai plugin cache, hapus cache sebelum memeriksa.
Langkah 4: Hentikan header X-Powered-By
X-Powered-By adalah header yang ditambahkan oleh PHP, bukan WordPress, dan menunjukkan versi PHP. Untuk menghentikannya, ubah expose_php menjadi Off di file konfigurasi PHP (php.ini). Pengaturan ini hanya bisa diubah di php.ini.
expose_php = Off
Ini contoh untuk Ubuntu di VPS yang memakai PHP-FPM (sesuaikan 8.3 dengan versi PHP yang Anda pakai).
# Periksa pengaturan saat ini
grep -n '^expose_php' /etc/php/8.3/fpm/php.ini
# Setelah mengubah, mulai ulang PHP-FPM
sudo systemctl restart php8.3-fpm
php.ini pada paket Ubuntu sudah berisi expose_php = Off pada kondisi awal. Jika header tetap muncul, periksa apakah php.ini lain sedang dipakai. Di rental server, terkadang bisa diubah lewat pengaturan PHP di layar admin hosting, dan terkadang tidak bisa.
Jika php.ini tidak bisa diubah, ada juga cara menghapus header lewat kode WordPress. Namun send_headers adalah hook yang berjalan saat WordPress menampilkan halaman sisi depan, sehingga tidak berpengaruh pada layar admin dan halaman login.
add_action( 'send_headers', function () {
header_remove( 'X-Powered-By' );
} );
Langkah 5: Tolak akses ke readme.html dan license.txt
readme.html dan license.txt adalah file inti WordPress. readme.html saat ini tidak memuat nomor versi, tetapi file itu menunjukkan bahwa situs memakai WordPress.
Meskipun dihapus, file akan kembali saat inti WordPress diperbarui. Menolak akses di web server lebih praktis daripada menghapusnya.
Jika memakai Apache (.htaccess)
Tambahkan ke .htaccess di folder WordPress. Bagian di antara # BEGIN WordPress dan # END WordPress ditulis ulang oleh WordPress, jadi tulis di luar bagian itu. Ini penulisan untuk Apache 2.4 (Order dan Deny from all adalah penulisan lama Apache 2.2).
<FilesMatch "^(readme\.html|license\.txt)$">
Require all denied
</FilesMatch>
Jika memakai Nginx
Tambahkan ke blok server situs, periksa konfigurasinya, lalu muat ulang.
location ~* ^/(readme\.html|license\.txt)$ {
deny all;
}
sudo nginx -t && sudo systemctl reload nginx
Setelah menambahkan, jalankan curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html dan pastikan 403 dikembalikan.
Yang tidak bisa dicegah meski disembunyikan
- Isi file CSS dan JS WordPress sedikit berbeda di setiap versi, sehingga versi bisa diperkirakan dengan mengambil dan membandingkan file tersebut
- Versi plugin terkadang bisa diketahui dari
readme.txtatauver=milik plugin dan tema. Yang lebih sering diincar adalah kerentanan plugin, bukan inti - Bagi orang yang bisa login ke layar admin, versi tetap ditampilkan seperti biasa
Karena itu, selain menyembunyikan versi, lakukan juga pembaruan inti, plugin, dan tema, menghapus plugin yang tidak dipakai, serta menonaktifkan pengeditan file di layar admin.
Ringkasan
- Versi terutama muncul di generator pada HTML dan feed, serta
?ver=pada CSS dan JS./wp-json/pada REST API tidak memuat versi WordPress - Generator pada HTML dan feed sekaligus bisa dihapus dengan
add_filter( 'the_generator', '__return_empty_string' ); - Jangan hapus
?ver=; ganti saja nilai yang sama dengan versi WordPress, sehingga pembaruan cache tidak terhenti X-Powered-Bydihentikan denganexpose_php = Offdi php.inireadme.htmlakan kembali saat pembaruan meski dihapus, jadi tolak aksesnya di web server- Menyembunyikan hanyalah langkah pendukung; yang terpenting adalah terus melakukan pembaruan
Artikel terkait:
- Cara mengatur security header WordPress | .htaccess, Nginx, functions.php
- Cara membatasi akses ke REST API WordPress
- Menonaktifkan editor file tema dan plugin WordPress | DISALLOW_FILE_EDIT
Ada pertanyaan tentang WordPress? Penerbit situs ini berada di Jepang dan membalas dalam bahasa Jepang. Kontak (bahasa Jepang)