Dokümanlar

Sorun rehberi · Güvenlik

Başka siteler oturum açmış kullanıcının verisini okuyabiliyor (CORS)

ÖnemYüksek
KategoriGüvenlik
KapsamTüm site
EmekOrta
DoğrulamaGüvenlik taraması (haftalık ya da Yeniden tara)
Kural anahtarısec_cors_credentials

Kısa cevap

CORS başlıkları, tarayıcılara hangi başka sitelerin yanıtlarınızı JavaScript ile okuyabileceğini söyler. Sunucunuz Access-Control-Allow-Credentials: true değerini * ile ya da istekte hangi Origin yazıyorsa onunla birlikte gönderiyor. Origin aynen geri yazılıyorsa, oturum açmış bir ziyaretçinin açtığı her site sayfalarınızı ve API yanıtlarınızı o ziyaretçi adına okuyabilir. Yalnız kendi alan adlarınızdan oluşan sabit bir listeye izin verin ya da kimlik bilgisi başlığını kaldırın.

Neden önemli

Normalde ziyaretçinin tarayıcısında sizin çerezleriniz olsa bile başka bir sitedeki betik sayfalarınızı okuyamaz. Her Origin değerini geri yazan ve kimlik bilgisine izin veren sunucu bu korumayı kapatır: kötü niyetli bir sayfa, reklam ya da ele geçirilmiş bir site, kullanıcınız oturum açıkken hesap sayfalarını, sipariş geçmişini, API anahtarlarını ya da CSRF jetonlarını sessizce çekip başka yere gönderebilir. Ziyaretçinin o sayfayı açması yeterlidir.

Tarayıcılar düz * değerini kimlik bilgisiyle birleştirmeyi reddeder; bu durum doğrudan sömürülemez ama tehlikeli ayara tek bir düzenleme uzaklıkta bir yapılandırmayı gösterir. SEO etkisi yoktur; konu kullanıcılarınızın verisidir.

Glimana bunu nasıl tespit eder

Glimana HTTPS ana sayfanıza (yönlendirmelerden sonra vardığı adrese, örneğin www sürümüne) uydurma bir Origin: https://cors-check.glimana.invalid başlığıyla bir istek daha gönderir. Yanıt bu deneme kökenini Access-Control-Allow-Origin içinde aynen geri yazıyor ve Access-Control-Allow-Credentials: true gönderiyorsa kontrol başarısız olur (Yüksek): o zaman herhangi bir site oturum açmış kullanıcının yanıtlarını okuyabilir. * ile kimlik bilgisi birlikte geçer, çünkü tarayıcılar bu birleşimi reddeder ve hiçbir şey okunamaz. Yalnız ana sayfa sınanır; /wp-json/ ya da /api/ gibi API yollarını ayrıca gözden geçirin.

Nasıl düzeltilir

Dikkat

Bunu "example.com içeriyor mu" gibi gevşek bir denetimden sonra Origin değerini geri yazarak düzeltmeyin; https://example.com.attacker.net bu denetimden geçer. Kökenin tamamını, iki ucundan sabitlenmiş biçimde birebir eşleyin ve önbelleklerin ve CDN'lerin bir sitenin CORS yanıtını başka siteye sunmaması için Vary: Origin gönderin.

  1. Glimana'da bulguyu bulun. Güvenlik sayfasını açın; bu kontrol Çerezler ve siteler arası erişim grubunda, son taramanın kanıtı başlığının altında. Aynı sorun Sorunlar › Başka siteler oturum açmış kullanıcının verisini okuyabiliyor (CORS) altında da listelenir.
  2. Düzeltmeyi platformunuzda uygulayın.

    WordPress çekirdeği normal sayfalara CORS başlığı eklemez. REST API'si (/wp-json/) tasarım gereği kökeni kimlik bilgisiyle geri yazar ve çerezle kimliği doğrulanan istekler için nonce ister; bu kontrolün baktığı yer orası değildir. Ana sayfada bu başlıklar varsa kaynak bir eklentidir (CORS, headless ya da uygulama bağlantı eklentileri) veya .htaccess dosyasına eklenmiş bir kuraldır. .htaccess dosyasında ve eklenti ayarlarında Access-Control-Allow arayın ve kendi alan adlarınızla sınırlayın.

    config/cors.php içinde kökenleri birebir yazın, örneğin 'allowed_origins' => ['https://app.example.com'], ve 'paths' değerini CORS gereken rotalarla sınırlayın, örneğin ['api/*']. 'supports_credentials' => true ise bunu asla 'allowed_origins' => ['*'] ya da geniş bir allowed_origins_patterns girdisiyle birleştirmeyin; paket o zaman her kökeni geri yazar. Ardından php artisan config:cache çalıştırın.

    Önce Access-Control-Allow-Origin değerini * ya da isteğin kökeni yapan kuralları kaldırın. Apache (mod_setenvif, mod_headers):

    • SetEnvIf Origin "^(https://(www\.)?example\.com)$" CORS_ORIGIN=$1
    • Header always set Access-Control-Allow-Origin "%{CORS_ORIGIN}e" env=CORS_ORIGIN
    • Header always set Access-Control-Allow-Credentials "true" env=CORS_ORIGIN
    • Header always merge Vary "Origin"

    Nginx, http bloğunda: map $http_origin $cors_origin { default ""; "~^https://(www\.)?example\.com$" $http_origin; } ve map $cors_origin $cors_cred { default ""; "~." "true"; }; server bloğunda: add_header Access-Control-Allow-Origin $cors_origin always;, add_header Access-Control-Allow-Credentials $cors_cred always;, add_header Vary Origin always;. Nginx değeri boş olan başlığı göndermez.

  3. Glimana'da kontrol edin. Güvenlik sayfasında Yeniden tara düğmesine basın (saatte en çok iki tarama) ya da pazar günkü haftalık taramayı bekleyin; kontrol geçince sorun kapanır.

Düzeltme nasıl doğrulanır

Düzelttikten sonra Güvenlik sayfasında Yeniden tara düğmesine basın (ya da pazar günkü haftalık taramayı bekleyin); kontrol geçtiği anda sorun kapanır.

Kaynaklar

Bu sayfa işinize yaradı mı?

Son güncelleme 2026-11-07 · Destekle iletişim