WordPress, dünya genelinde milyonlarca web sitesine güç veren en popüler içerik yönetim sistemi olma özelliğini korumaktadır. Ancak bu yaygınlık, beraberinde ciddi güvenlik tehditlerini de getirmektedir. Kötü niyetli aktörler, WordPress kurulumlarını hedef alırken en sık başvurdukları yöntemlerden biri zararlı PHP dosyalarını belirli dizinlere yükleyerek sunucu üzerinde kod çalıştırmaktır. Uploads, cache ve benzeri yazılabilir klasörler, bu tür saldırılar için birincil hedef haline gelmektedir. PHP yürütmesini bu dizinlerde devre dışı bırakmak, saldırı yüzeyini dramatik biçimde daraltır ve sitenizi çok daha güvenli bir konuma taşır.
PHP Yürütme Neden Tehlikelidir?
WordPress’in çalışma mantığı gereği bazı dizinler, kullanıcıların veya sistemin dosya yükleyebildiği alanlardır. wp-content/uploads klasörü bunların en bilinenidir; medya dosyaları, belgeler ve görseller bu dizinde depolanır. Sorun şu ki WordPress, bu dizinlere yüklenen dosyaların türünü her zaman mükemmel biçimde denetleyemez. Bir saldırgan, güvenlik açıklarını kullanarak bu klasöre bir PHP dosyası yükleyebilir ve ardından tarayıcı üzerinden o dosyayı doğrudan çağırarak sunucuda rastgele komutlar çalıştırabilir. Bu tür saldırılara Remote Code Execution (RCE) yani uzaktan kod yürütme adı verilir ve web güvenliğinin en kritik tehdit kategorilerinden birini oluşturur.
Benzer risk; wp-content/cache, wp-content/uploads/woocommerce_uploads, bazı eklentilerin geçici dosya klasörleri ve hatta yanlış yapılandırılmış wp-includes alt dizinlerinde de mevcuttur. PHP’nin bu dizinlerde çalışmasına izin vermek, bir yangın tüpünü yüklü tutarak onu ateşin yanına koymak gibidir; tehlike her an gerçeğe dönüşebilir.
Hangi Dizinler Korunmalıdır?
Öncelikle hangi dizinlerin PHP yürütmesinden arındırılması gerektiğini net biçimde belirlemek gerekir. Bu liste sitenizin yapısına göre genişleyebilir, ancak temel korumanın mutlaka kapsadığı alanlar şunlardır:
wp-content/uploads/ — En kritik hedef. Tüm medya yüklemeleri burada depolanır ve neredeyse her WordPress sitesinde dışarıdan yazılabilir durumdadır.
wp-content/cache/ — Önbellek eklentileri (W3 Total Cache, WP Super Cache vb.) tarafından kullanılan bu klasör, büyük hacimli geçici dosyalar içerir ve PHP yürütmesine kesinlikle ihtiyaç duymaz.
wp-content/uploads/woocommerce_uploads/ — WooCommerce kullanan sitelerde ürün dosyaları bu alanda saklanır. Hassas ticari verileri barındırması nedeniyle çift kat koruma gerektirir.
wp-includes/ — WordPress çekirdek dosyalarını barındırır. Bu dizindeki PHP dosyaları zaten sistem tarafından yönetilir; dışarıdan ek PHP yürütülmesine hiçbir koşulda izin verilmemelidir.
Apache Sunucularında .htaccess ile PHP Yürütmesini Engelleme
Apache web sunucusu kullanan paylaşımlı hostingler ve birçok VPS ortamı için .htaccess dosyası, PHP yürütmesini dizin bazında kontrol etmenin en pratik yöntemidir. İşlem son derece basittir: ilgili dizine bir .htaccess dosyası yerleştirilir ve bu dosyaya PHP işlemeyi engelleyen direktifler eklenir.
wp-content/uploads/ dizini için aşağıdaki .htaccess içeriği kullanılır:
<Files *.php>
deny from all
</Files>Bu kural, söz konusu dizindeki tüm .php uzantılı dosyalara HTTP erişimini tamamen kapatır. Dosya fiziksel olarak sunucuda var olsa bile tarayıcı üzerinden çağrılamaz; sunucu 403 Forbidden yanıtı döner.
Daha kapsamlı bir koruma için PHP’nin farklı uzantılarla çalıştırılabileceği senaryolar da göz önünde bulundurulmalıdır:
<FilesMatch "\.(php|php3|php4|php5|php7|phtml|phar)$">
deny from all
</FilesMatch>FilesMatch direktifi, birden fazla uzantıyı tek kuralda kapsar. .phtml ve .phar uzantıları özellikle gözden kaçan saldırı vektörleridir; bu nedenle listeye dahil edilmeleri kritik önem taşır.
Bazı eski Apache yapılandırmalarında php_flag direktifi tercih edilir:
php_flag engine offAncak bu yöntem yalnızca PHP’nin Apache modülü (mod_php) olarak çalıştığı ortamlarda geçerlidir. PHP-FPM kullanan modern sunucularda bu direktif etkisiz kalır; bu nedenle FilesMatch yaklaşımı daha evrensel bir çözümdür.
Nginx Sunucularında PHP Yürütmesini Engelleme
Nginx kullanan VPS veya dedicated sunucularda yapılandırma, Apache’den farklı biçimde sunucu bloğu (server block) üzerinden yönetilir. wp-content/uploads dizini için PHP yürütmesini engelleyen Nginx kuralı şu şekilde yazılır:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}Daha kapsamlı bir kural için birden fazla PHP uzantısı şöyle hedeflenebilir:
location ~* /wp-content/uploads/.*\.(php|php3|php4|php5|phtml|phar)$ {
deny all;
return 403;
}return 403 direktifi, erişim girişiminde açık bir hata mesajı döndürür ve sunucu günlüklerine kaydeder; bu sayede olası saldırı denemeleri izlenebilir hale gelir.
Eğer wp-content/cache ve diğer alt dizinler de aynı anda korunmak isteniyorsa, kurallar birleştirilebilir:
location ~* ^/wp-content/(uploads|cache|temp)/.*\.php$ {
deny all;
return 403;
}WP-CLI ile Otomatik .htaccess Yerleştirme
Birden fazla dizini manuel olarak korumak zaman alıcı olabilir. WP-CLI kullanıcıları için toplu işlem şöyle gerçekleştirilebilir:
echo '<Files *.php>
deny from all
</Files>' > /var/www/html/wp-content/uploads/.htaccessBu komutu bir cron görevi ya da dağıtım betiği içine gömmek, yeni kurulumların veya güncellemelerin ardından koruma dosyasının silinip silinmediğini otomatik denetlemenizi sağlar. Bazı eklentiler veya WordPress güncellemeleri, ilgili dizindeki .htaccess dosyalarını zaman zaman yeniden yazabilir; bu yüzden periyodik doğrulama ihmal edilmemelidir.
PHP Yürütme Engeli ile Birlikte Uygulanması Gereken Ek Önlemler
PHP yürütme engellemesi tek başına yeterli olmakla birlikte, katmanlı güvenlik (defense in depth) yaklaşımı çok daha sağlam bir koruma sunar.
Dosya yükleme türü doğrulaması ilk tamamlayıcı önlemdir. WordPress’in medya yükleme aracı zaten bazı kontroller yapar, ancak eklentiler aracılığıyla ek MIME tipi doğrulaması eklemek saldırı yüzeyini daraltır. WP File Manager, Secure Media Library veya özel upload_mimes filtreleri bu amaçla kullanılabilir.
Dizin listelemenin kapatılması ikinci önemli adımdır. Eğer bir saldırgan dizin içeriğini görebiliyorsa, PHP olmayan dosyalar üzerinden bile keşif gerçekleştirebilir. Apache için .htaccess dosyasına Options -Indexes satırı eklenmelidir.
Dosya izinlerinin doğru yapılandırılması da göz ardı edilmemelidir. WordPress’in resmi önerisine göre dizinler 755, dosyalar ise 644 izniyle çalışmalıdır. Yazma izinlerinin gereğinden geniş tutulması (örneğin 777), PHP yürütme engellerini anlamsız kılabilir çünkü saldırgan konfigürasyon dosyalarının üzerine yazabilir.
Web Application Firewall (WAF) kullanımı, PHP enjeksiyon denemelerini kural tabanlı olarak filtreler. Cloudflare WAF, Wordfence’in güvenlik duvarı veya ModSecurity bu kategoride değerlendirilebilir.
Yapılandırma Sonrası Test ve Doğrulama
Güvenlik kurallarını uyguladıktan sonra çalışıp çalışmadığını doğrulamak zorunludur. Test için uploads dizinine basit bir PHP dosyası yüklenip tarayıcı üzerinden erişilmeye çalışılabilir:
<?php echo "test"; ?>Bu dosyayı https://siteniz.com/wp-content/uploads/test.php adresinden açmaya çalıştığınızda 403 Forbidden hatası almanız, kuralın doğru çalıştığını kanıtlar. Eğer PHP kodu çalışıyor ve ekrana “test” yazısı geliyorsa, yapılandırma hatalıdır ve gözden geçirilmelidir.
cURL ile komut satırından test:
curl -I https://siteniz.com/wp-content/uploads/test.phpDönen yanıtta HTTP/1.1 403 Forbidden görülmesi beklenen sonuçtur.
Güvenlik Eklentileri ile Otomatik Koruma
Tüm bu yapılandırmaları manuel yapmak istemeyenler için Wordfence Security, iThemes Security (SolidSecurity) ve Sucuri Security gibi eklentiler, PHP yürütme engelini otomatik olarak yapılandıran araçlar sunar. Wordfence’in “WordPress Integrity” taraması, uploads dizinindeki şüpheli PHP dosyalarını tespit ederken; iThemes Security’nin “System Tweaks” bölümü tek tıkla .htaccess tabanlı PHP engelini etkinleştirir.
Ancak eklentilere tam bağımlılık önerilmez. Eklenti güncellemeleri veya devre dışı bırakılmaları halinde koruma katmanı ortadan kalkabilir. Manuel yapılandırma ile eklenti korumasının birlikte kullanılması en sağlam yaklaşımdır.
WordPress güvenliği, tek seferlik bir işlem değil; sürekli güncellenmesi ve denetlenmesi gereken canlı bir süreçtir. PHP yürütme engellemesi bu sürecin temel taşlarından biridir ve doğru uygulandığında en yaygın saldırı vektörlerinden birini fiilen etkisiz kılar.








