WordPress, headless mimarilerin ve modern web uygulamalarının yaygınlaşmasıyla birlikte yalnızca bir içerik yönetim sistemi olmaktan çıkıp güçlü bir backend platformuna dönüştü. Ancak bu dönüşümün merkezinde yer alan API altyapısı, doğru yapılandırılmadığında ciddi siber güvenlik risklerini beraberinde getirir. WordPress REST API güvenliği, sitenizin veri gizliliğini korumak, sunucu kaynaklarının tükenmesini engellemek ve kötü niyetli botların sisteminize sızmasını önlemek için hayati bir role sahiptir. Varsayılan ayarlarla gelen bir WordPress kurulumunda, halka açık olan endpoint'ler üzerinden kullanıcı adları, eklenti yapılandırmaları ve hassas site metadataları dış dünyaya sergilenebilir. Genel API kavramları hakkında temel bilginizi tazelemek isterseniz API Nedir? REST API Temelleri ve Kullanımı içeriğimize göz atabilirsiniz.
Bu rehberde, 2026 yılı güvenlik standartlarını dikkate alarak WordPress REST API altyapınızı nasıl koruma altına alacağınızı, hassas endpoint'leri nasıl kısıtlayacağınızı ve istek sınırlama (rate limiting) mekanizmalarını nasıl kod seviyesinde uygulayacağınızı adım adım inceleyeceğiz.
WordPress REST API Varsayılan Yapısı ve Güvenlik Riskleri
WordPress REST API, varsayılan olarak /wp-json/ rotası altında çalışır ve oturum açmamış (anonim) ziyaretçilere bile birçok veri noktasını açık olarak sunar. Örneğin, tarayıcınızın adres çubuğuna yoursite.com/wp-json/wp/v2/users yazdığınızda, sitede kayıtlı yazarların ve yöneticilerin ID'leri, kullanıcı adları ve biyografileri JSON formatında listelenir. Bu durum, kaba kuvvet (brute force) saldırısı düzenlemek isteyen bir saldırgan için altın değerinde bir bilgi toplama (reconnaissance) aşamasıdır.
REST API üzerindeki temel risk alanları şunlardır:
- Kullanıcı Bilgilerinin Sızması:
/wp-json/wp/v2/usersendpoint'i üzerinden admin kullanıcı adlarının tespiti. - DoS ve DDoS Saldırıları: Herhangi bir sorgu sınırı bulunmayan API rotalarına binlerce eşzamanlı istek atılarak veritabanı performansının kilitlenmesi.
- Yetkisiz Veri Erişimi: Özel içerik tiplerinin (Custom Post Types) veya taslak durumundaki verilerin hatalı yapılandırılmış endpoint'ler aracılığıyla sızması.
- Eklenti ve Tema Zafiyetleri: Üçüncü taraf eklentilerin oluşturduğu kontrolsüz API uç noktaları. Kendi güvenli uç noktalarınızı oluşturmak için WordPress REST API Kullanım Rehberi: Özel Endpoint Oluşturma kılavuzumuzdan yararlanabilirsiniz.
WordPress REST API Güvenliği İçin Endpoint Kısıtlama Teknikleri
API güvenliğini sağlamanın ilk adımı, yetkisiz kullanıcıların erişmemesi gereken rotaları kapatmak veya tüm API erişimini oturum açma şartına bağlamaktır. Ancak bu işlemi yaparken WordPress'in iç mekanizmalarını bozmamaya dikkat etmelisiniz.
1. Tüm REST API İsteklerini Kimlik Doğrulamaya Zorlama
Eğer WordPress siteniz tamamen kapalı bir sistemse veya API'nizi yalnızca giriş yapmış kullanıcıların kullanmasını istiyorsanız, rest_authentication_errors filtresini kullanarak anonim tüm istekleri engelleyebilirsiniz.
Aşağıdaki kodu temanızın functions.php dosyasına veya özel bir güvenlik eklentisine ekleyebilirsiniz:
add_filter('rest_authentication_errors', function($result) {
if (!empty($result)) {
return $result;
}
if (!is_user_logged_in()) {
return new WP_Error(
'rest_not_logged_in',
'REST API erişimi için giriş yapmalısınız.',
array('status' => 401)
);
}
return $result;
});
Önemli Uyarı: REST API'yi tamamen kapatmak, Gutenberg blok düzenleyicisinin ve Tam Site Düzenleme (FSE) araçlarının çalışmasını engelleyebilir. WordPress'in güncel editör ekosistemi hakkında detaylı bilgi için WordPress Ekosisteminde Son Durum: Gutenberg'in Evrimi ve Tam Site Düzenleme (FSE) yazımızı okuyabilirsiniz.
2. Belirli Endpoint'leri (Örn: Users) Devre Dışı Bırakma
Tüm API'yi kapatmak yerine, sadece riskli endpoint'leri anonim kullanıcılara kapatmak çok daha sağlıklı bir yaklaşımdır. Özellikle /wp-json/wp/v2/users endpoint'ini hedef alarak kullanıcı sızıntısını önleyebilirsiniz:
add_filter('rest_endpoints', function($endpoints) {
if (!is_user_logged_in()) {
if (isset($endpoints['/wp-json/wp/v2/users'])) {
unset($endpoints['/wp-json/wp/v2/users']);
}
if (isset($endpoints['/wp-json/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp-json/wp/v2/users/(?P<id>[\d]+)']);
}
}
return $endpoints;
});
Alternatif bir veri sorgulama mimarisi arıyorsanız, REST API yerine esnek sorgulama yetenekleri sunan GraphQL yaklaşımını incelemek için GraphQL Nedir? REST API Farkları ve WPGraphQL Kurulum Rehberi içeriğimizi ziyaret edebilirsiniz.
Rate Limiting (İstek Sınırlama) Uygulama
Rate limiting, belirli bir IP adresinden veya kullanıcıdan gelen istek sayısını zaman dilimi bazında (örneğin dakikada 30 istek) sınırlandırma işlemidir. Bu teknik, brute force ve DoS saldırılarını engellemek için kritik öneme sahiptir.
PHP ve WordPress Transients API ile Rate Limiting
Sunucu seviyesinde bir güvenlik duvarınız yoksa, WordPress içinde Transients API kullanarak basit ve etkili bir istek sınırlayıcı oluşturabilirsiniz.
Aşağıdaki kod örneği, giriş yapmamış bir IP adresinin REST API'ye dakikada en fazla 30 istek göndermesine izin verir:
add_filter('rest_pre_dispatch', function($result, $server, $request) {
if (is_user_logged_in()) {
return $result; // Giriş yapmış kullanıcıları sınırlandırma
}
$ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
$transient_key = 'rate_limit_' . md5($ip);
$request_count = get_transient($transient_key);
$max_requests = 30; // Dakika başına izin verilen maksimum istek
$time_window = 60; // Saniye cinsinden süre
if ($request_count === false) {
set_transient($transient_key, 1, $time_window);
} elseif ($request_count >= $max_requests) {
return new WP_Error(
'rest_rate_limit_exceeded',
'Çok fazla istek gönderdiniz. Lütfen bir dakika sonra tekrar deneyin.',
array('status' => 429)
);
} else {
set_transient($transient_key, $request_count + 1, $time_window);
}
return $result;
}, 10, 3);
Sunucu Seviyesinde Rate Limiting (Nginx & Apache)
PHP seviyesindeki sınırlama sunucu yükünü azaltsa da veritabanı sorgusu çalıştırdığı için yüksek hacimli saldırılarda yetersiz kalabilir. En ideal yöntem, sınırlamayı web sunucusu (Nginx veya Apache) seviyesinde yapmaktır.
Nginx Konfigürasyonu:
Nginx konfigürasyon dosyanızın (nginx.conf veya site bloğu) http bölümüne şu kuralı ekleyin:
limit_req_zone $binary_remote_addr zone=wp_api_limit:10m rate=10r/m;
Daha sonra server veya /wp-json konum bloğunuza şu kısıtlamayı uygulayın:
location ~ ^/wp-json/ {
limit_req zone=wp_api_limit burst=5 nodelay;
try_files $uri $uri/ /index.php?$args;
}
Bu ayar, bir IP adresinin /wp-json/ altına dakikada ortalama 10 istek atmasına izin verir ve anlık 5 isteğe kadar esneklik (burst) tanır. Limiti aşan isteklere HTTP 429 (Too Many Requests) hatası döner.
REST API Kimlik Doğrulama Yöntemleri
Modern WordPress uygulamalarında API güvenliğini sağlamak için doğru kimlik doğrulama katmanını seçmeniz gerekir.
Authorization: Bearer <token> başlığında gönderir.wp_rest) doğrulaması ile CSRF saldırılarına karşı koruma sağlar.// Frontend JavaScript isteklerinde Nonce kullanımı
fetch('/wp-json/wp/v2/posts', {
method: 'POST',
headers: {
'X-WP-Nonce': wpApiSettings.nonce,
'Content-Type': 'json'
},
body: JSON.stringify({ title: 'Yeni Yazı' })
});
WordPress REST API Güvenliğinde Sık Yapılan Hatalar
REST API yapılandırmalarında en sık karşılaşılan hatalar ve bunlardan kaçınma yolları şunlardır:
.htaccess veya Eklenti İle Tamamen Kapatmak: Gutenberg editörü, WooCommerce ve birçok popüler eklenti REST API kullanır. API'yi bilinçsizce tamamen kapatmak sitenizin yönetim panelini kullanılamaz hale getirebilir.*) Yapmak: Access-Control-Allow-Origin: * başlığını kullanmak, herhangi bir web sitesinin kullanıcının tarayıcısı üzerinden sitenize yetkisiz istek atmasına olanak tanır. Yalnızca güvenilir domain'lere izin verin./wp-json/ rotasına özel güvenlik kuralları oluşturmamak.Sonuç ve Sonraki Adımlar
WordPress REST API güvenliği, modern bir WordPress sitesinin yönetilmesinde göz ardı edilmemesi gereken kritik bir unsurdur. API'yi tamamen kapatmak yerine, hassas endpoint'leri gizlemek, kullanıcı sorgularını kısıtlamak ve sunucu seviyesinde rate limiting uygulamak en doğru yaklaşımdır.
Hemen Atabileceğiniz İlk Adım: Sitenizdeki /wp-json/wp/v2/users bağlantısını gizli bir sekmede açarak inceleyin. Eğer kullanıcı adlarınız listeleniyorsa, yukarıda paylaştığımız rest_endpoints PHP filtresini sitenize ekleyerek kullanıcı verilerinizi derhal koruma altına alın.
Yorumlar (0)
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yazın