WordPress Dosya Düzenleyiciyi Devre Dışı Bırakma: Güvenlik İçin functions.php Ayarı
WordPress sitenizi yönetirken güvenlik açıklarını kapatmak, özellikle paylaşımlı hosting ortamlarında veya birden fazla kullanıcının eriştiği sistemlerde kritik önem taşır. WordPress’in varsayılan olarak sunduğu Dosya Düzenleyici (Theme Editor ve Plugin Editor) özelliği, görünürde pratik bir araç gibi görünse de aslında ciddi bir güvenlik riski oluşturur. Bu yazıda, neden bu editörü devre dışı bırakmanız gerektiğini, bunu nasıl yapacağınızı ve farklı senaryolarda nasıl uygulayabileceğinizi detaylıca ele alacağız.
Dosya Düzenleyici Nedir ve Neden Tehlikelidir?
WordPress yönetim paneline girdiğinizde Görünüm > Tema Düzenleyici veya Eklentiler > Eklenti Düzenleyici menülerine ulaşabilirsiniz. Bu editörler, doğrudan tarayıcı üzerinden PHP, CSS ve JavaScript dosyalarını düzenlemenize olanak tanır. Kulağa kullanışlı geliyor, değil mi? Ancak işin güvenlik boyutuna baktığınızda tablo hiç de iç açıcı değil.
Düşünün: Bir saldırgan WordPress admin hesabınıza erişim sağladığında, sunucuya doğrudan SSH erişimi olmasa bile bu editörler aracılığıyla herhangi bir PHP kodunu çalıştırabilir. Bir system() çağrısı, bir exec() fonksiyonu veya zararlı bir web shell, birkaç saniye içinde tema dosyalarınıza enjekte edilebilir. Bu, yetkisiz erişimden tam sunucu kompromizasyonuna geçiş için son derece düşük bir eşik demektir.
Gerçek dünya senaryosu olarak düşünelim: Bir e-ticaret sitesi yönetiyorsunuz, WooCommerce kurulu, ödeme sisteminiz entegre. Bir çalışanın şifresi phishing saldırısıyla ele geçirildi. Saldırgan admin paneline giriş yaptı ve tema düzenleyicisi üzerinden functions.php dosyasına birkaç satır kod ekledi. Bu kod, her sipariş tamamlandığında kredi kartı bilgilerini harici bir sunucuya gönderiyor. Fark edene kadar yüzlerce müşterinin verisi sızdırılmış olabilir.
functions.php ile Editörü Devre Dışı Bırakma
En yaygın ve kolay uygulanan yöntem, functions.php dosyasına bir sabit (constant) tanımlamaktır. DISALLOW_FILE_EDIT sabiti WordPress’e tema ve eklenti editörlerini tamamen gizlemesini söyler.
# functions.php dosyasını düzenlemek için önce yedeğini alın
cp /var/www/html/wp-content/themes/your-theme/functions.php
/var/www/html/wp-content/themes/your-theme/functions.php.bak
Şimdi functions.php dosyasına şu kodu ekleyin:
cat >> /var/www/html/wp-content/themes/your-theme/functions.php << 'EOF'
// Dosya düzenleyiciyi devre dışı bırak
if ( ! defined( 'DISALLOW_FILE_EDIT' ) ) {
define( 'DISALLOW_FILE_EDIT', true );
}
EOF
Bu kodu ekledikten sonra WordPress admin panelinde Görünüm menüsünden “Tema Düzenleyici” seçeneği kaybolur, Eklentiler menüsünden de “Eklenti Düzenleyici” seçeneği görünmez olur.
DISALLOW_FILE_MODS ile Daha Kapsamlı Koruma
DISALLOW_FILE_EDIT yalnızca editörleri kapatır, ancak eklenti ve tema güncellemelerini engellemez. Daha sıkı bir güvenlik politikası istiyorsanız DISALLOW_FILE_MODS sabitini kullanabilirsiniz. Bu sabit hem editörleri hem de yönetim paneli üzerinden yapılan tüm dosya değişikliklerini (eklenti kurma, tema güncelleme dahil) engeller.
# functions.php'ye kapsamlı koruma ekle
cat >> /var/www/html/wp-content/themes/your-theme/functions.php << 'EOF'
// Tum dosya degisikliklerini engelle (editörler + güncellemeler)
if ( ! defined( 'DISALLOW_FILE_MODS' ) ) {
define( 'DISALLOW_FILE_MODS', true );
}
EOF
Dikkat: DISALLOW_FILE_MODS aktifken otomatik güncelleme ve manuel güncelleme işlemlerini de WP-CLI veya doğrudan dosya sistemi üzerinden yapmanız gerekecektir. Üretim ortamlarında bu genellikle istenen bir davranıştır çünkü değişiklikler gözden geçirilmeden uygulanmaz.
wp-config.php Üzerinden Tanımlama
Daha iyi bir pratik olarak bu sabitleri wp-config.php dosyasında tanımlamanızı öneririm. Bu sayede tema değişse bile koruma aktif kalır.
# wp-config.php'yi düzenle
nano /var/www/html/wp-config.php
wp-config.php içinde / That's all, stop editing! / satırından önce şu satırları ekleyin:
# wp-config.php içine eklenecek tanımlar
define( 'DISALLOW_FILE_EDIT', true );
define( 'DISALLOW_FILE_MODS', true );
/* That's all, stop editing! Happy publishing. */
Bu yaklaşım çok daha güvenlidir çünkü:
- Tema bağımsızlığı: Tema değişse, silinse veya güncellense bile ayar aktif kalır
- Merkezi yönetim: Tüm güvenlik sabitlerini tek bir yerden yönetirsiniz
- Öncelik:
wp-config.phpWordPress yüklenmeden önce işlendiği için bypass edilmesi çok daha zordur
Koşullu Uygulama: Geliştirme ve Üretim Ortamı Farkı
Gerçek dünyada genellikle bir geliştirme (development), test (staging) ve üretim (production) ortamınız vardır. Geliştirme ortamında editörlerin açık olmasını isteyebilirsiniz, ancak üretimde kesinlikle kapalı olmalıdır.
# Ortam tabanlı koşullu kontrol için functions.php örneği
cat >> /var/www/html/wp-content/themes/your-theme/functions.php << 'EOF'
/**
* Ortama göre dosya düzenleyici kontrolü
* WP_ENVIRONMENT_TYPE: 'local', 'development', 'staging', 'production'
*/
function disable_file_editor_in_production() {
$environment = wp_get_environment_type();
// Sadece production ve staging ortamlarında kapat
if ( in_array( $environment, array( 'production', 'staging' ), true ) ) {
if ( ! defined( 'DISALLOW_FILE_EDIT' ) ) {
define( 'DISALLOW_FILE_EDIT', true );
}
}
}
// WordPress yüklenmeden önce çalışması için init hook'una bağla
add_action( 'init', 'disable_file_editor_in_production', 1 );
EOF
Ortam tipini wp-config.php üzerinden tanımlayabilirsiniz:
# wp-config.php'de ortam tipi tanımlama
define( 'WP_ENVIRONMENT_TYPE', 'production' ); # Üretim sunucusu için
# define( 'WP_ENVIRONMENT_TYPE', 'development' ); # Geliştirme için
Kullanıcı Rolüne Göre Editör Erişimi
Bazı durumlarda editörün tamamen kapatılması pratik olmayabilir. Örneğin, tek başınıza yönettiğiniz ama zaman zaman diğer yöneticilerin erişmesi gereken bir site söz konusu olabilir. Bu durumda editörü tamamen kapatmak yerine yalnızca belirli kullanıcılar için erişimi kısıtlayabilirsiniz.
cat >> /var/www/html/wp-content/themes/your-theme/functions.php << 'EOF'
/**
* Belirli kullanıcı ID'leri hariç editörü kapat
* Güvenilir yönetici kullanıcı ID'lerini buraya ekleyin
*/
function restrict_file_editor_by_user() {
// Sadece bu ID'lere sahip kullanıcılar editörü kullanabilir
$allowed_user_ids = array( 1 ); // Sadece ID'si 1 olan süper admin
$current_user_id = get_current_user_id();
if ( ! in_array( $current_user_id, $allowed_user_ids, true ) ) {
if ( ! defined( 'DISALLOW_FILE_EDIT' ) ) {
define( 'DISALLOW_FILE_EDIT', true );
}
}
}
add_action( 'init', 'restrict_file_editor_by_user', 1 );
EOF
Uyarı: Bu yaklaşımı yalnızca geçici bir çözüm olarak kullanın. Uzun vadede editörü tamamen kapatıp değişiklikleri Git + deployment pipeline üzerinden yönetmek çok daha güvenlidir.
WP-CLI ile Toplu Yönetim
Birden fazla WordPress sitesi yönetiyorsanız (çok kiracılı hosting, ajans ortamı gibi), her sitenin functions.php dosyasını tek tek düzenlemek yerine WP-CLI kullanabilirsiniz.
# WP-CLI ile sabit değer kontrol etme
wp eval 'echo defined("DISALLOW_FILE_EDIT") ? "Aktif" : "Pasif";' --path=/var/www/html
# Birden fazla site için toplu kontrol scripti
#!/bin/bash
SITES_DIR="/var/www/vhosts"
for site_dir in "$SITES_DIR"/*/httpdocs; do
if [ -f "$site_dir/wp-config.php" ]; then
echo "--- Site: $site_dir ---"
wp eval 'echo "FILE_EDIT: " . (defined("DISALLOW_FILE_EDIT") ? "Kapalı" : "AÇIK - DİKKAT!") . "n";'
--path="$site_dir" 2>/dev/null
fi
done
Bu script çalıştırıldığında hangi sitelerde editörün hala açık olduğunu anında görebilirsiniz. “AÇIK – DİKKAT!” çıktısı veren siteleri derhal ele almanız gerekir.
Ek Güvenlik Katmanları
Dosya editörünü kapatmak güvenliğin sadece bir parçasıdır. Bunu destekleyen ek önlemleri de uygulamanız gerekir.
wp-config.php Dosya İzinleri
# wp-config.php için güvenli izinler
chmod 440 /var/www/html/wp-config.php
chown www-data:www-data /var/www/html/wp-config.php
# functions.php için izinler
chmod 644 /var/www/html/wp-content/themes/your-theme/functions.php
# WordPress kök dizini için önerilen izinler
find /var/www/html -type f -exec chmod 644 {} ;
find /var/www/html -type d -exec chmod 755 {} ;
# Kritik dosyalar için özel kısıtlama
chmod 400 /var/www/html/wp-config.php
.htaccess ile Ek Koruma (Apache)
cat >> /var/www/html/.htaccess << 'EOF'
# wp-config.php erişimini engelle
<files wp-config.php>
order allow,deny
deny from all
</files>
# functions.php doğrudan erişimini engelle
<files functions.php>
order allow,deny
deny from all
</files>
EOF
functions.php İçinde Yönetici Bildirim Sistemi
Editörü kapattığınızda, bazı yöneticiler neden erişemediklerini anlamayabilir. Onlara bilgi vermek için bir admin bildirimi ekleyebilirsiniz:
cat >> /var/www/html/wp-content/themes/your-theme/functions.php << 'EOF'
/**
* Dosya düzenleyici kapalıysa yöneticilere bilgilendirme mesajı göster
*/
function show_editor_disabled_notice() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
if ( defined( 'DISALLOW_FILE_EDIT' ) && DISALLOW_FILE_EDIT === true ) {
echo '<div class="notice notice-info is-dismissible">';
echo '<p><strong>Güvenlik Bildirimi:</strong> ';
echo 'Dosya düzenleyici güvenlik politikası gereği devre dışı bırakılmıştır. ';
echo 'Dosya değişiklikleri için sistem yöneticinize başvurunuz.</p>';
echo '</div>';
}
}
add_action( 'admin_notices', 'show_editor_disabled_notice' );
EOF
Güvenlik Denetimi ve Loglama
Editörü kapatmak önemli, ancak daha önce ne zaman kullanıldığını da bilmek istersiniz. WordPress audit log için bir izleme fonksiyonu ekleyebilirsiniz.
cat >> /var/www/html/wp-content/themes/your-theme/functions.php << 'EOF'
/**
* Tema ve eklenti dosyası değişiklik girişimlerini logla
*/
function log_file_edit_attempts( $page ) {
if ( in_array( $page, array( 'theme-editor.php', 'plugin-editor.php' ), true ) ) {
$user = wp_get_current_user();
$log_message = sprintf(
'[%s] Dosya editörü erişim girişimi - Kullanıcı: %s (ID: %d) - IP: %s - Sayfa: %s',
date( 'Y-m-d H:i:s' ),
$user->user_login,
$user->ID,
$_SERVER['REMOTE_ADDR'] ?? 'Bilinmiyor',
$page
);
// WordPress hata loguna yaz
error_log( $log_message );
// Özel log dosyasına da yaz
$log_file = WP_CONTENT_DIR . '/security-audit.log';
file_put_contents( $log_file, $log_message . PHP_EOL, FILE_APPEND | LOCK_EX );
}
}
add_action( 'load-theme-editor.php', function() {
log_file_edit_attempts( 'theme-editor.php' );
});
add_action( 'load-plugin-editor.php', function() {
log_file_edit_attempts( 'plugin-editor.php' );
});
EOF
Log dosyasını düzenli olarak kontrol etmek için bir cron job oluşturabilirsiniz:
# Crontab'a ekle: Her gün gece güvenlik logunu kontrol et
crontab -e
# Aşağıdaki satırı ekleyin:
0 8 * * * grep "$(date +%Y-%m-%d)" /var/www/html/wp-content/security-audit.log | mail -s "WordPress Güvenlik Raporu" [email protected]
Değişiklikleri Doğrulama
Tüm bu ayarları yaptıktan sonra, düzgün çalışıp çalışmadığını doğrulamanız gerekir.
# WP-CLI ile tüm güvenlik sabitlerini kontrol et
wp eval '
$checks = array(
"DISALLOW_FILE_EDIT" => defined("DISALLOW_FILE_EDIT") && DISALLOW_FILE_EDIT,
"DISALLOW_FILE_MODS" => defined("DISALLOW_FILE_MODS") && DISALLOW_FILE_MODS,
"WP_DEBUG" => defined("WP_DEBUG") && WP_DEBUG,
);
foreach ( $checks as $constant => $value ) {
$status = $value ? "✓ Aktif" : "✗ Pasif";
echo $constant . ": " . $status . "n";
}
' --path=/var/www/html
Beklenen çıktı şöyle görünmelidir:
# Beklenen WP-CLI çıktısı
DISALLOW_FILE_EDIT: ✓ Aktif
DISALLOW_FILE_MODS: ✓ Aktif
WP_DEBUG: ✗ Pasif
Ayrıca web tarayıcısı üzerinden WordPress yönetim paneline girerek Görünüm menüsünü kontrol edin. “Tema Düzenleyici” seçeneği görünmüyorsa ayarlar doğru çalışıyor demektir.
Yaygın Hatalar ve Çözümleri
Uygulamada karşılaşabileceğiniz bazı sorunlar ve çözümleri:
- functions.php bozuldu, siteye erişemiyorum: Önce FTP veya SSH ile yedekten geri yükleyin. Her zaman değişiklik öncesi yedek alın.
- Sabit tanımlandı ama editör hala görünüyor:
wp-config.php‘de sonradan aynı sabitifalseile tanımlayan başka bir kod olabilir.wp eval 'echo DISALLOW_FILE_EDIT;'ile gerçek değeri kontrol edin.
- DISALLOW_FILE_MODS aktif ama güvenlik güncellemeleri gelmiyor: WordPress otomatik güvenlik güncellemeleri için
AUTOMATIC_UPDATER_DISABLEDsabitini ayrıca kontrol edin. Güvenlik yamalarını manuel olarak uygulamanız gerekebilir.
- Çok siteli (multisite) kurulumda çalışmıyor: Multisite kurulumlarında sabitleri
wp-config.php‘de tanımlamak zorunludur,functions.phpyeterli olmayabilir.
- Tema güncellemesi yapınca ayar sıfırlandı: Eğer sabitleri
functions.php‘de tanımladıysanız ve alt tema (child theme) kullanmıyorsanız, tema güncellemesifunctions.php‘nizi sıfırlar. Mutlaka alt tema kullanın veya sabitleriwp-config.php‘de tanımlayın.
Sonuç
WordPress dosya düzenleyicisini devre dışı bırakmak, birkaç satır kodla uygulanabilen ama son derece yüksek güvenlik değeri olan bir önlemdir. Özellikle WooCommerce gibi hassas ödeme verilerinin işlendiği sitelerde bu adımı atlamak büyük riskler doğurur.
Özetlemek gerekirse izlemeniz gereken yol şudur: Sabitleri functions.php yerine wp-config.php‘de tanımlayın, hem DISALLOW_FILE_EDIT hem de DISALLOW_FILE_MODS sabitlerini kullanın, dosya izinlerini doğru şekilde ayarlayın ve düzenli güvenlik denetimi yapın. Geliştirme süreçlerinizi de bu kısıtlamaya uygun şekilde yeniden yapılandırın: Yerel geliştirme ortamında değişiklik yapın, Git ile sürüm kontrolü altında tutun, deployment pipeline üzerinden üretim ortamına taşıyın.
Unutmayın, güvenlik tek bir önlemden ibaret değildir. Dosya editörünü kapatmak önemli bir adım, ancak bunu güçlü şifre politikaları, iki faktörlü kimlik doğrulama, düzenli yedekleme ve güncel tutma pratikleriyle desteklemeniz gerekir. Sistem yöneticisi olarak görevimiz, saldırı yüzeyini mümkün olduğunca küçültmek ve her savunma katmanını sağlam tutmaktır.
