2026年11月12日
2026年11月12日
WordPress Sürüm Bilgisini Gizleme: generator Etiketi, ver=, readme.html
Bu makale, Japonca orijinalin yerelleştirilmiş sürümüdür. Japonca orijinali oku
WordPress, varsayılan durumda sürüm numarasını sayfanın HTML'ine ve akışlara (feed) yazar. Saldırganlar bunu görüp bilinen açıkları olan bir sürüm olup olmadığını araştırmak için ipucu olarak kullanabilir. Bu yazıda sürümün göründüğü yerleri kontrol edip gizleme adımları anlatılır. İçerik Ekim 2026 itibarıyladır.
Önce bilmeniz gereken, sürümü gizlemenin yardımcı bir önlem olduğudur. CSS ve JavaScript dosyalarının içeriği gibi yerlerden sürümü tahmin etmenin yolları da bulunduğundan, gizlemek sürümün tespit edilmesini mutlaka önlemez. En etkili yol, WordPress çekirdeğini, eklentileri ve temaları güncel tutmaktır.
Sürümün göründüğü yerler
| Yer | Görünen içerik | Çözüm |
|---|---|---|
HTML'in <head> bölümü |
<meta name="generator" content="WordPress 6.9.4"> gibi bir etiket |
the_generator filtresi |
| RSS ve Atom akışları | <generator>https://wordpress.org/?v=6.9.4</generator> gibi bir satır |
Yine the_generator filtresi |
| CSS ve JavaScript URL'leri | style.min.css?ver=6.9.4 gibi bir ?ver= |
style_loader_src ve script_loader_src filtreleri |
| HTTP başlığı | X-Powered-By: PHP/8.3.x (WordPress'in değil, PHP'nin sürümü) |
php.ini içindeki expose_php |
readme.html |
WordPress kullanıldığı (güncel readme.html'de sürüm numarası yazmaz) | Erişimi reddetmek |
REST API'nin /wp-json/ adresinin döndürdüğü site bilgilerinde (ad, açıklama, URL, saat dilimi, ad alanları vb.) WordPress sürümü yer almaz. Sürümü gizlemek amacıyla REST API çıktısını kısmanıza gerek yoktur.
Adım 1: Şu anki görünüm durumunu kontrol edin
Kendi sitenizin URL'siyle değiştirerek, bilgisayarınızda veya sunucuda çalıştırın. Önbellek eklentileri veya CDN kullanıyorsanız, değişiklikten sonra önbelleği temizleyip kontrol edin.
# HTML'deki generator etiketi
curl -s https://example.com/ | grep -i 'name="generator"'
# Akıştaki generator
curl -s https://example.com/feed/ | grep -i '<generator>'
# CSS ve JS'ye eklenen ver= değerlerinin listesi
curl -s https://example.com/ | grep -oE 'ver=[0-9][0-9.]*' | sort | uniq -c
# HTTP başlığındaki X-Powered-By
curl -sI https://example.com/ | grep -i 'x-powered-by'
# readme.html okunabiliyor mu (200 ise okunabiliyor)
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html
ver= listesinde, yönetim ekranında "Panel" (Dashboard) → "Güncellemeler" (Updates) bölümünde görünen WordPress sürümüyle aynı bir değer varsa, o CSS veya JS'den WordPress sürümü anlaşılabilir durumdadır. WordPress çekirdeği veya tema CSS/JS yüklerken sürüm belirtmezse, WordPress sürümü ver= içine girer.
Adım 2: Kodu nereye koyacağınıza karar verin
Bu yazıdaki kodu aşağıdakilerden birine koyun.
- mu-plugin (önerilir):
wp-content/mu-plugins/klasörüne (yoksa oluşturun) bir PHP dosyası koyarsanız, etkinleştirme işlemi gerekmeden yüklenir. Tema değişse de etkisi sürer - Alt temanın functions.php dosyası: Üst temanın functions.php dosyasına yazarsanız, tema güncellemesinde silinir
mu-plugin yapacaksanız wp-content/mu-plugins/hide-wp-version.php gibi bir adla, sonraki adımdaki kodu tek bir dosyada toplayıp kaydedin.
Adım 3: generator etiketini ve ver= içindeki sürümü gizleyin
<?php
/**
* Plugin Name: Hide WordPress Version
* Description: generator etiketinde ve CSS/JS'deki ver= içinde görünen WordPress sürümünü gizler.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// HTML'deki <meta name="generator"> ve akıştaki <generator> öğesini boşalt.
add_filter( 'the_generator', '__return_empty_string' );
/**
* CSS/JS'deki ver= yalnızca WordPress sürümüyle aynıysa başka bir değerle değiştir.
* ver= silinmez, değiştirilir; böylece WordPress güncellendikten sonra tarayıcı önbelleği de güncellenir.
*/
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 );
Dikkat edilecek noktalar şunlardır.
the_generatorfiltresi hem HTML'deki generator etiketi hem de akıştaki generator için çalışır.remove_action( 'wp_head', 'wp_generator' );yalnızca HTML'deki etiketi kaldırır, akışa etkisi yoktur- Tüm
?ver=değerlerini silerseniz, eklenti veya tema güncellendiğinde tarayıcı eski CSS/JS'yi kullanmaya devam edebilir. Yukarıdaki kod yalnızca WordPress sürümüyle aynı değerde olanı, sürümden üretilen başka bir dizeyle değiştirir. WordPress güncellenince değer de değiştiği için önbellek güncellenir - Eklentilerin veya temaların kendi sürüm numarasını verdiği
ver=değerlerine dokunulmaz
Kaydettikten sonra, Adım 1'deki komutlarla generator'ın çıkmadığını ve ver= listesinde WordPress sürümünün kalmadığını kontrol edin. Önbellek eklentisi kullanıyorsanız, önbelleği temizleyip kontrol edin.
Adım 4: X-Powered-By başlığını kapatın
X-Powered-By, WordPress'in değil PHP'nin eklediği bir başlıktır ve PHP sürümünü gösterir. Kapatmak için PHP yapılandırma dosyasında (php.ini) expose_php değerini Off yapın. Bu ayar yalnızca php.ini üzerinden değiştirilebilir.
expose_php = Off
Ubuntu üzerindeki bir VPS'te PHP-FPM kullanılan duruma örnek (8.3, kullandığınız PHP sürümüne göre değiştirilir).
# Mevcut ayarı kontrol et
grep -n '^expose_php' /etc/php/8.3/fpm/php.ini
# Değiştirdikten sonra PHP-FPM'yi yeniden başlat
sudo systemctl restart php8.3-fpm
Ubuntu paketindeki php.ini, varsayılan olarak expose_php = Off durumundadır. Başlık yine de çıkıyorsa başka bir php.ini kullanılıp kullanılmadığını kontrol edin. Kiralık sunucularda bu, yönetim ekranındaki PHP ayarlarından değiştirilebilir de olabilir, değiştirilemez de.
php.ini'yi değiştiremiyorsanız, başlığı WordPress koduyla kaldırma yolu da vardır. Ancak send_headers, WordPress ön yüz sayfalarını çıkarırken çalışan bir kancadır; bu yüzden yönetim ekranı ve giriş ekranı için etkisi yoktur.
add_action( 'send_headers', function () {
header_remove( 'X-Powered-By' );
} );
Adım 5: readme.html ve license.txt’e erişimi reddedin
readme.html ve license.txt, WordPress çekirdeğinin dosyalarıdır. Güncel readme.html içinde sürüm numarası yazmaz, ancak WordPress kullanıldığı anlaşılır.
Sildiğiniz halde WordPress çekirdeğini güncellediğinizde geri gelirler. Silmek yerine web sunucusunda erişimi reddetmek daha az zahmetlidir.
Apache (.htaccess) için
WordPress klasöründeki .htaccess dosyasına ekleyin. # BEGIN WordPress ile # END WordPress arasını WordPress yeniden yazar; bu yüzden bunun dışına yazın. Apache 2.4 yazımıdır (Order ve Deny from all, Apache 2.2'nin eski yazımıdır).
<FilesMatch "^(readme\.html|license\.txt)$">
Require all denied
</FilesMatch>
Nginx için
Sitenin server bloğuna ekleyin; ayarı kontrol ettikten sonra yeniden yükleyin.
location ~* ^/(readme\.html|license\.txt)$ {
deny all;
}
sudo nginx -t && sudo systemctl reload nginx
Ekledikten sonra curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html komutunu çalıştırıp 403 döndüğünü doğrulayın.
Gizlenince bile önlenemeyenler
- WordPress'in CSS ve JS dosyalarının içeriği sürümden sürüme biraz farklı olduğundan, dosyaları alıp karşılaştırarak sürüm tahmin edilebilir
- Eklentilerin veya temaların
readme.txtdosyasından ya daver=değerinden eklenti sürümü anlaşılabilir. Hedef alınması en olası olan, çekirdekten çok eklenti açıklarıdır - Yönetim ekranına giriş yapabilenlere sürüm eskisi gibi gösterilir
Bu yüzden sürümü gizlemenin yanında çekirdeğin, eklentilerin ve temaların güncellenmesini, kullanılmayan eklentilerin silinmesini, yönetim ekranındaki dosya düzenlemenin devre dışı bırakılmasını da uygulayın.
Özet
- Sürüm başlıca HTML ve akıştaki generator ile CSS/JS'deki
?ver=içinde görünür. REST API'nin/wp-json/adresinde WordPress sürümü yer almaz add_filter( 'the_generator', '__return_empty_string' );ile hem HTML'deki hem akıştaki generator kaldırılabilir?ver=değerini silmeden, yalnızca WordPress sürümüyle aynı olanı değiştirirseniz önbelleğin güncellenmesini engellemezsinizX-Powered-By, php.ini içindekiexpose_php = Offile kapatılırreadme.htmlsilinse bile güncellemeyle geri gelir; bu yüzden web sunucusunda erişimi reddedin- Gizlemek yardımcı bir önlemdir; en önemlisi güncellemeleri sürdürmektir
İlgili yazılar:
- WordPress güvenlik başlıklarını ayarlama: .htaccess, Nginx ve functions.php için ayrı ayrı
- WordPress REST API erişimini kısıtlama yöntemi
- WordPress tema ve eklenti dosya düzenleyicisini devre dışı bırakma: DISALLOW_FILE_EDIT
WordPress hakkında sorunuz mu var? Bu sitenin yayıncısı Japonya'dadır ve Japonca yanıt verir. İletişim (Japonca)