WordPress REST API Neden Risk Oluşturur?
WordPress 4.7 sürümüyle birlikte çekirdeğe entegre edilen REST API, headless WordPress mimarileri, mobil uygulamalar ve üçüncü taraf entegrasyonlar için devrim niteliğinde bir adım oldu. Ancak varsayılan ayarlarıyla gelen açık yapısı, WordPress REST API Güvenliği konusunu tüm site sahipleri ve geliştiriciler için kritik bir gündem maddesi haline getirmiştir. Varsayılan konfigürasyonda /wp-json/ rotası herkese açıktır. Bu durum, kötü niyetli aktörlerin sitenizdeki kullanıcı adlarını, kategori yapılarını, eklenti verilerini ve yayınlanmamış taslakların bazı meta bilgilerini oturum açmadan taramasına olanak tanır.
Özellikle /wp-json/wp/v2/users adresi, sitenizde yazı yazan veya yönetici rolüne sahip tüm kullanıcıların ID, kullanıcı adı ve profil detaylarını dış dünyaya sunar. Saldırganlar bu bilgileri elde ettikten sonra kaba kuvvet (brute force) saldırılarını doğrudan hedeflenen kullanıcı adlarına yönlendirerek başarı şanslarını artırırlar. Sitenizin genel güvenliğini artırmak için WordPress Güvenlik Önlemleri: Sitenizi Hackerlardan Koruma Rehberi içeriğimize göz atabilirsiniz. Bu rehberde, REST API'yi tamamen kapatmadan nasıl esnek, güvenli ve performanslı bir biçimde kısıtlayabileceğinizi kod örnekleriyle ele alacağız.
WordPress REST API Temel Güvenlik Riskleri
REST API'nin kontrolsüz bırakılması sitenizde birden fazla güvenlik zafiyetine yol açabilir. Bu riskleri doğru anlamak, hangi erişim kısıtlama stratejisini seçeceğinizi belirlemenize yardımcı olur.
1. Kullanıcı Verilerinin İfşası (User Enumeration)
Bir tarayıcı veya basit bir curl komutuyla /wp-json/wp/v2/users isteği atan herkes, sitenizdeki kayıtlı kullanıcıların id ve slug değerlerini görebilir. Bu durum, yönetici paneli kullanıcı adının dışarı sızması demektir.
2. Hizmet Engelleme (DoS) ve Yüksek Sunucu Yükü
REST API sorguları, veritabanı üzerinde standart sayfa yüklemelerine göre bazen daha karmaşık SQL sorguları çalıştırır. Saldırganlar veya bot ağları, /wp-json/wp/v2/posts?per_page=100 gibi ağır API isteklerini saniyede yüzlerce kez tekrarlayarak sunucu kaynaklarınızı tüketebilir.
3. Yetkisiz Veri Değişiklikleri ve Zayıf Endpoint'ler
Eğer sitenizde özel kodlanmış endpoint'ler varsa ve bunlar yetkilendirme (authorization) kontrollerini eksik yapıyorsa, dışarıdan veri sızdırılması veya veri yazılması mümkündür. Özel endpoint mimarisini doğru kurgulamak için WordPress REST API Kullanım Rehberi: Özel Endpoint Oluşturma rehberimizi inceleyebilirsiniz.
4. Eklenti Zafiyetlerinin Kolay Tetiklenmesi
Sitenizde yüklü bazı eklentiler kendi REST API endpoint'lerini oluşturur. Bu endpoint'lerde bulunan bir güvenlik açığı, API herkese açık olduğunda kimlik doğrulamasına takılmadan doğrudan istismar edilebilir.
REST API Tamamen Kapatılmalı mı?
Geçmişte birçok güvenlik eklentisi REST API'yi tamamen devre dışı bırakmayı öneriyordu. Ancak günümüz WordPress ekosisteminde REST API'yi tamamen kapatmak sitenizde ciddi kırılmalara yol açar:
- Gutenberg (Blok Editör): İçerik kaydetme, blok yükleme ve taslak yönetimi için tamamen REST API kullanır.
- WooCommerce ve Mobil Uygulamalar: Mağaza yönetimi, mobil bildirimler ve sipariş takibi API üzerinden yürür.
- Site Sağlığı (Site Health) ve Gösterge Paneli: Admin panelindeki birçok dinamik araç REST API çağrıları yapar.
Bu nedenle amacımız API'yi tamamen yok etmek değil, oturum açmamış (anonim) kullanıcılara karşı kısıtlamak ve yetkisiz erişimleri engellemektir. Alternatif API mimarileri arıyorsanız GraphQL Nedir? REST API Farkları ve WPGraphQL Kurulum Rehberi makalemiz ilginizi çekebilir.
Kod İle WordPress REST API Güvenliği ve Erişim Kısıtlama
Eklenti kullanmadan, temanızın functions.php dosyasına veya özel bir konfigürasyon eklentisine ekleyeceğiniz kodlarla REST API'ye tam kontrol getirebilirsiniz.
Yöntem 1: Anonim Kullanıcılara REST API'yi Tamamen Kapatmak
Eğer siteniz headless bir mimari kullanmıyorsa ve dışarıya API hizmeti sunmuyorsa, yalnızca giriş yapmış kullanıcıların API'ye erişmesini sağlayabilirsiniz.
Aşağıdaki kodu aktif temanızın functions.php dosyasına ekleyin:
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 yalnızca yetkili kullanıcılar içindir.', 'text-domain' ),
array( 'status' => 401 )
);
}
return $result;
});
Bu kod sayesinde giriş yapmamış her ziyaretçi API isteği attığında HTTP 401 Unauthorized hatası alır. Ancak Gutenberg editörü yönetici panelinde oturum açmış kullanıcılar tarafından sorunsuz çalışmaya devam eder.
Yöntem 2: Sadece Kullanıcı Listeleme Endpoint'ini Kısıtlama
Siteniz dışarıya yazı verisi sunmak istiyor ama kullanıcı adlarının çalınmasını engellemek istiyorsanız, sadece /wp-json/wp/v2/users endpoint'ini devre dışı bırakabilirsiniz.
add_filter( 'rest_endpoints', function( $endpoints ) {
if ( isset( $endpoints['/wp-json/wp/v2/users'] ) && ! current_user_can( 'list_users' ) ) {
unset( $endpoints['/wp-json/wp/v2/users'] );
}
if ( isset( $endpoints['/wp-json/wp/v2/users/(?P<id>[\d]+)'] ) && ! current_user_can( 'list_users' ) ) {
unset( $endpoints['/wp-json/wp/v2/users/(?P<id>[\d]+)'] );
}
return $endpoints;
});
Bu yaklaşım sayesinde kamuya açık içerikleriniz API üzerinden okunabilir kalırken, kullanıcı tespiti saldırıları tamamen engellenir.
Yöntem 3: Belirli Rotalara İzin Verip Diğerlerini Engelleme (Beyaz Liste)
Sitenizde sadece belirli endpoint'lerin (örneğin iletişim formu veya özel bir mobil uygulama rotası) herkese açık olmasını, kalan tüm rotaların kilitlenmesini istiyorsanız aşağıdaki beyaz liste yaklaşımını uygulayabilirsiniz:
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
$allowed_routes = array(
'/wp-json/contact-form-7/',
'/wp-json/myplugin/v1/custom-data',
);
$current_route = $_SERVER['REQUEST_URI'];
if ( ! is_user_logged_in() ) {
$is_allowed = false;
foreach ( $allowed_routes as $route ) {
if ( strpos( $current_route, $route ) !== false ) {
$is_allowed = true;
break;
}
}
if ( ! $is_allowed ) {
return new WP_Error(
'rest_restricted',
__( 'Bu API rotasına erişim izniniz bulunmuyor.', 'text-domain' ),
array( 'status' => 403 )
);
}
}
return $result;
});
Application Passwords ile Güvenli Kimlik Doğrulama
WordPress çekirdeğinde yerleşik olarak gelen Application Passwords (Uygulama Şifreleri) özelliği, ana kullanıcı şifrenizi paylaşmadan üçüncü taraf servislerin REST API'ye güvenli şekilde bağlanmasını sağlar.
Uygulama Şifresi Nasıl Oluşturulur?
API isteklerinizde HTTP Basic Auth başlığı kullanarak bu şifreyi iletebilirsiniz:
curl -X GET https://example.com/wp-json/wp/v2/posts \
-u "kullanici_adi:xxxx xxxx xxxx xxxx xxxx xxxx"
Bu yöntem sayesinde ana şifrenizi tehlikeye atmadan API erişim yetkilerini istediğiniz an iptal edebilirsiniz.
Sunucu ve Firewall Düzeyinde REST API Güvenliği
Kod seviyesindeki önlemler PHP çalıştıktan sonra devreye girer. Ancak bir DoS veya kaba kuvvet saldırısı anında sunucu kaynaklarını korumak için korumayı sunucu veya WAF katmanında başlatmak gerekir.
1. Cloudflare ile Rate Limiting ve Kural Oluşturma
Cloudflare paneli üzerinden /wp-json/wp/v2/users* adresine gelen tüm istekleri bloklayan bir WAF kuralı oluşturabilirsiniz:
/wp-json/wp/v2/usersAyrıca Rate Limiting kuralı tanımlayarak aynı IP adresinden /wp-json/ rotasına 1 dakika içinde 30'dan fazla istek gelirse bu IP'yi geçici olarak engelleyebilirsiniz.
2. Nginx İle Kullanıcı İfşasını Engelleme
Nginx konfigürasyon dosyanıza ekleyeceğiniz küçük bir blok ile isteklerin PHP motoruna dahi ulaşmadan reddedilmesini sağlayabilirsiniz:
location ~* /wp-json/wp/v2/users {
deny all;
return 403;
}
Bu yöntem sunucu üzerindeki CPU yükünü sıfıra indirir çünkü istek PHP yetkilendirme mekanizmasına ulaşmadan web sunucusu tarafından kesilir.
Eklenti Kullanarak REST API Kısıtlama
Kod yazmak istemiyorsanız güvenilir eklentilerle de benzer güvenlik seviyesine ulaşabilirsiniz:
Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler
.htaccess veya Nginx ile tüm /wp-json/ yolunu kapatmak Gutenberg editörünün ve eklenti güncellemelerinin çalışmasını bozar.permission_callback parametresini boş bırakmayın.Sonuç
WordPress REST API güvenliği, modern bir web sitesini yönetirken göz ardı edilmemesi gereken kritik bir konudur. API'yi bilinçsizce tamamen kapatmak sitenizin işlevselliğini bozarken, tamamen açık bırakmak ise veri sızıntılarına ve kaba kuvvet saldırılarına davetiye çıkarır.
Atacağınız en etkili ilk adım; /wp-json/wp/v2/users rotasını anonim kullanıcılara kapatmak ve sunucu seviyesinde rate limiting uygulamaktır. Sitenizi test etmek için gizli tarayıcı penceresinde yoursite.com/wp-json/wp/v2/users adresini ziyaret edin; eğer tüm kullanıcı adlarınız listeleniyorsa rehberdeki kod örneklerini vakit kaybetmeden sitenize uygulayın.
Yorumlar (0)
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yazın