WordPress REST API Güvenliği ve Erişim Kısıtlama Rehberi

WordPress REST API Güvenliği ve Erişim Kısıtlama Rehberi

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?

  • WordPress Yönetim Paneline giriş yapın.
  • Kullanıcılar > Profil sekmesine gidin.
  • Sayfanın en altındaki Uygulama Şifreleri bölümüne gelin.
  • Yeni şifre için bir isim yazın (örneğin: Mobil İstatistik Botu) ve Yeni Uygulama Şifresi Ekle butonuna tıklayın.
  • Ekrana gelen şifreyi kopyalayın ve uygulamanıza tanımlayın.
  • 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:

  • Field: URI Path
  • Operator: starts with
  • Value: /wp-json/wp/v2/users
  • Action: Block veya Managed Challenge
  • Ayrı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:

  • Disable REST API: Yalnızca giriş yapmış kullanıcıların API erişimine izin veren minimalist bir eklentidir.
  • Wordfence Security: REST API üzerindeki zararlı istekleri otomatik algılar ve bilinen açık hatlarını kapatır.
  • Solid Security (Eski adıyla iThemes Security): REST API erişim seviyelerini arayüz üzerinden detaylı şekilde yönetmenize olanak tanır.

Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler

  • REST API'yi Tamamen Bloklamak: .htaccess veya Nginx ile tüm /wp-json/ yolunu kapatmak Gutenberg editörünün ve eklenti güncellemelerinin çalışmasını bozar.
  • CORS Ayarlarını İhmal Etmek: API'nize gelen isteklerin tüm domainlerden kabul edilmesini engellemek için CORS başlıklarını sınırlandırın.
  • Özel Endpoint'lerde Yetki Kontrolünü Unutmak: Kendi endpoint'lerinizi yazarken 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.

    Sıkça Sorulan Sorular

    WordPress REST API tamamen kapatılmalı mı?
    Hayır, REST API'yi tamamen kapatmak Gutenberg editörünün, WooCommerce mağaza işlevlerinin ve Site Sağlığı aracının bozulmasına neden olur. Yalnızca anonim erişimleri kısıtlamak en doğru yöntemdir.
    WordPress kullanıcı adlarının API üzerinden sızması nasıl engellenir?
    functions.php dosyanıza ekleyeceğiniz bir filtre kodu veya Nginx/Cloudflare kuralları ile /wp-json/wp/v2/users endpoint'ine yetkisiz erişimleri engelleyebilirsiniz.
    Application Passwords (Uygulama Şifreleri) güvenli midir?
    Evet, Uygulama Şifreleri ana hesap şifrenizi vermeden harici uygulamalara sınırlı API erişimi tanır ve istediğiniz zaman panelden iptal edilebilir.
    WxDigitals
    WxDigitals

    WebTeknoloji.net editör ekibi; web geliştirme, SEO, hosting ve yapay zeka alanlarında üretilen içeriklerin araştırma, test ve yayın süreçlerini yürütür. Tüm incelemeler gerçek kullanım deneyimine, karşılaştırmalar ise resmi dokümantasyon ve güncel fiyatlandırma sayfalarına dayanır.

    Bu içeriği faydalı bulduysanız…

    Haftalık teknoloji & SEO rehberlerimize katılın, 38 maddelik Teknik SEO Kontrol Listesi PDF'ini hediye olarak hemen indirin.

    Yorumlar (0)

    Henüz yorum yapılmamış. İlk yorumu siz yapın!

    Yorum Yazın