WordPress REST API Sızıntılarını Engelleme: Eklentileri Bozmadan Güvenliği Artırma Rehberi

WordPress REST API Nedir ve Neden Tehlike Saçar?

WordPress 4.7 sürümüyle birlikte çekirdeğe dahil edilen REST API (/wp-json/), modern web uygulamaları, mobil entegrasyonlar ve headless CMS mimarileri için harika bir özelliktir. Ancak varsayılan ayarlarda bu altyapı oturum açmamış (anonim) ziyaretçilere ve siber saldırganlara tamamen açıktır.

Otomatize güvenlik tarayıcıları (recon araçları, WPScan vb.) sitenize girdiğinde ilk olarak şu yolları sorgular:

/wp-json/wp/v2/users → Sitedeki tüm kullanıcı adlarını ve ID’lerini ifşa eder (Brute-Force saldırılarına zemin hazırlar).

/wp-json/wp/v2/posts & /wp-json/wp/v2/pages → Taslak veya yayınlanmış içerik yapılarını dökümler.

/wp-json/wp/v2/media → Yüklenen tüm görsel ve belge dizinlerini sunar.

Bilinçsizce Yapılan Hata: REST API’yi Tamamen Kapatmak

Birçok site sahibi güvenlik eklentileri veya internetteki hazır kodlarla REST API’yi tamamen kapatmayı dener. Ancak bu durum şu sorunlara yol açar:

  1. İletişim Formları Kilitlenir: Contact Form 7, Cloudflare Turnstile gibi eklentiler AJAX doğrulaması yapamaz.
  2. E-Ticaret Akışı Bozulur: WooCommerce ve ödeme altyapıları (PayTR vb.) webhook/callback bildirimlerinde aksama yaşar.
  3. Gutenberg Editör Çalışmaz: WordPress blok editörü kaydetme hataları verir.

Çözüm: Akıllı Endpoint Kısıtlama (Whitelist Approach)

En sağlıklı yaklaşım; içeride çalışan eklentilerin API yollarına dokunmadan, sadece bilgi sızıntısına yol açan varsayılan WordPress çekirdek (wp/v2) yollarını anonim kullanıcılara kapatmaktır.

Uygulama: functions.php Dosyasına Eklenecek Kod

Aktif temanızın (veya tercihen Child Theme) functions.php dosyasının en altına aşağıdaki kodu ekleyin:

<?php
/**
 * WordPress REST API Hassas Endpoint Kısıtlaması
 * Eklentilerin (CF7, WooCommerce, Turnstile vb.) çalışmasını engellemeden 
 * varsayılan bilgi sızıntılarını anonim kullanıcılara kapatır.
 */

add_filter('rest_authentication_errors', function ($result) {
    // Zaten oluşmuş bir hata varsa müdahale etme
    if (!empty($result)) {
        return $result;
    }

    // Oturum açmış (Giriş yapmış) kullanıcılara tam yetki ver
    if (is_user_logged_in()) {
        return $result;
    }

    $route = $_SERVER['REQUEST_URI'] ?? '';

    // SADECE bilgi sızdıran hassas WP Core endpoint'lerini engelle
    $restricted_routes = [
        '/wp-json/wp/v2/users',     // Kullanıcı listesi / ID sızıntısı
        '/wp-json/wp/v2/posts',     // Gönderiler / İçerik haritası
        '/wp-json/wp/v2/pages',     // Sayfalar
        '/wp-json/wp/v2/comments',  // Yorumlar & E-posta izleri
        '/wp-json/wp/v2/media',     // Medya kütüphanesi
        '/wp-json/wp/v2/types',     // Post tipleri
    ];

    foreach ($restricted_routes as $restricted) {
        if (strpos($route, $restricted) !== false) {
            return new WP_Error(
                'rest_cannot_access',
                __('Bu API endpoint\'ine erişim yetkiniz bulunmamaktadır.', 'text-domain'),
                ['status' => 403]
            );
        }
    }

    // Diğer tüm eklenti ve özel API rotalarına İZİN VER
    return $result;
});

// REST API üzerinden kullanıcı endpoint'lerini tamamen sil
add_filter('rest_endpoints', function ($endpoints) {
    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;
});

// GET /?author=1 yöntemiyle kullanıcı adı tespitini engelle
if (!is_admin()) {
    if (isset($_REQUEST['author']) || (isset($_SERVER['REQUEST_URI']) && preg_match('/author=([0-9]*)/i', $_SERVER['REQUEST_URI']))) {
        wp_die('Erişim Engellendi.', 'Erişim Engellendi', ['response' => 403]);
    }
}

Sonuç ve Test

Kod eklendikten sonra sitenizi anonim bir pencereden (veya güvenlik tarayıcısıyla) test ettiğinizde /wp-json/wp/v2/users adresi 403 Forbidden yanıtı dönecektir. Buna karşın iletişim formlarınız, ödeme entegrasyonlarınız ve WooCommerce akışınız kesintisiz çalışmaya devam edecektir.