WordPress REST API Güvenliği: Endpoint Kısıtlama ve Rate Limiting Rehberi

WordPress REST API Güvenliği: Endpoint Kısıtlama ve Rate Limiting Rehberi

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/users endpoint'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.

  • Application Passwords (Uygulama Parolaları): WordPress çekirdeğinde yerleşik olarak gelen bu özellik, her harici uygulama için benzersiz ve kısıtlanabilir şifreler üretmenizi sağlar. Kullanıcının ana şifresini paylaşma zorunluluğunu ortadan kaldırır.
  • JWT (JSON Web Token): Headless WordPress mimarilerinde (React, Vue veya mobil uygulamalar) yaygın olarak kullanılır. İstemci, sunucudan aldığı imzalı token'ı HTTP Authorization: Bearer <token> başlığında gönderir.
  • Cookie Authentication: WordPress panosu içinde çalışan dâhili JavaScript uygulamaları için kullanılır. Nonce (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:

  • API'yi .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.
  • CORS (Cross-Origin Resource Sharing) Ayarlarını Wildcard (*) 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.
  • WAF (Web Application Firewall) Kurallarını İhmal Etmek: Cloudflare veya Sucuri gibi güvenlik duvarlarında /wp-json/ rotasına özel güvenlik kuralları oluşturmamak.
  • Test ve Geliştirme Ortamı Endpoint'lerini Unutmak: Özel eklentiler yazarken oluşturulan test endpoint'lerinin yetki kontrolü yapılmadan canlıya alınması.

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.

Sıkça Sorulan Sorular

WordPress REST API'yi tamamen kapatmak siteye zarar verir mi?
Evet. WordPress Gutenberg blok editörü, Tam Site Düzenleme (FSE) araçları ve birçok modern eklenti arka planda REST API kullanır. API'yi tamamen kapatmak yönetim panelinde kaydetme ve düzenleme hatalarına yol açar. Bunun yerine spesifik endpoint kısıtlaması yapmalısınız.
REST API üzerinden kullanıcı adlarının görünmesini nasıl engellerim?
rest_endpoints filtresini kullanarak anonim kullanıcılar için /wp-json/wp/v2/users endpoint'ini devre dışı bırakabilir veya yetkisiz isteklerin 401 Unauthorized hatası dönmesini sağlayabilirsiniz.
WordPress için en etkili Rate Limiting yöntemi hangisidir?
En etkili yöntem sunucu seviyesinde (Nginx/Apache) veya Cloudflare gibi bir WAF (Web Application Firewall) üzerinden yapılan sınırlamadır. PHP ve Transients API ile yapılan sınırlamalar da etkilidir ancak yüksek hacimli DoS saldırılarında sunucuya ek yük getirebilir.
Application Passwords nedir ve REST API güvenliğinde nasıl kullanılır?
Application Passwords, WordPress ana kullanıcı şifrenizi vermeden harici uygulamalara veya mobil cihazlara özel erişim şifreleri üretmenizi sağlayan yerleşik bir özelliktir. İstenildiği an tek bir uygulamanın erişimi 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