Application Security

CORS'u Ustalıkla Kullanma: Güvenli Web Uygulamaları için Son Yapılandırma Kılavuzu

Modern web geliştirme ortamında, alanlar arası iletişim sadece bir özellik değil, temel bir gerekliliktir. app.example.com üzerinde barındırılan ve api.example.com üzerinde bir API'yi tüketen bir Tek Sayfa Uygulaması (SPA) oluşturuyor olun veya üçüncü taraf mikro hizmetleri entegre ediyor olun, Cross-Origin Resource Sharing (CORS) protokolüyle kaçınılmaz olarak karşılaşacaksınız. CORS kullanıcıları korumak için tasarlanmış olsa da, yanlış yapılandırma güvenlik açıklarının ve geliştirme sorunlarının en yaygın kaynaklarından biri olmaya devam etmektedir. Bu kılavuz, CORS'u etkili, güvenli ve verimli bir şekilde yapılandırmak için kapsamlı bir teknik derinlemesine inceleme sunar.

Aynı Köken Politikasını Anlamak

CORS'u takdir etmek için, önce tarayıcının Aynı Köken Politikası'nı (SOP) anlamak gerekir. SOP, potansiyel olarak kötü amaçlı belgeleri izole eden, bir kökenden yüklenen bir belge veya betiğin başka bir kökenden bir kaynakla nasıl etkileşime girebileceğini kısıtlayan kritik bir güvenlik mekanizmasıdır. "Köken", şema, ana bilgisayar ve bağlantı noktası tarafından tanımlanır (örneğin, https://example.com:443).

Bir tarayıcı farklı bir kökene istek başlattığında, isteği doğrudan engellemez ancak yanıtı engeller. Sunucu, belirli HTTP başlıkları aracılığıyla açıkça izin vermezse, tarayıcı yanıtın istemci tarafı betiği tarafından okunmasını engeller. Bu, saldırganların tehlikeye atılmış bir sayfadaki kötü amaçlı betikler aracılığıyla diğer alanlardan hassas verileri çalmasını önler.

Temel CORS Başlıkları Açıklaması

CORS, istemci ile sunucu arasında değiştirilen bir dizi HTTP başlığı aracılığıyla çalışır. Ustalaşmanız gereken kritik başlıklar şunlardır:

  • Access-Control-Allow-Origin (ACAO): Hangi kökenlerin izin verildiğini belirtir. Belirli bir köken (https://frontend.com) veya bir joker karakter (*) olabilir.
  • Access-Control-Allow-Methods (ACAM): İzin verilen HTTP yöntemlerini listeler (GET, POST, PUT, DELETE vb.).
  • Access-Control-Allow-Headers (ACAH): Asıl istek sırasında hangi başlıkların kullanılabileceğini tanımlar (örneğin, Content-Type, Authorization).
  • Access-Control-Allow-Credentials (ACAC): İsteğin çerezler, yetkilendirme başlıkları veya TLS istemci sertifikaları gibi kullanıcı kimlik bilgilerini içerip içeremeyeceğini belirten bir boolean değerdir.

Access-Control-Allow-Credentials değeri true olarak ayarlandığında, Access-Control-Allow-Origin için joker karakter * kullanılamaz. Tarayıcı, kimlik bilgileriyle birlikte joker karakterli bir ACAO aldığında yanıtı reddeder. Bu, oturum tabanlı kimlik doğrulamasını etkinleştirmeye çalışan geliştiriciler için yaygın bir tuzaktır.

Pratik Yapılandırma Örnekleri

Tipik bir Node.js/Express ortamında CORS'un nasıl yapılandırılacağına bakalım. Bu örnek, ön istekleri dinamik olarak işleyen ve kökenleri bir beyaz listede doğrulayan güvenli bir kurulumu gösterir.

const express = require('express');
const app = express();

// Dinamik işleme için izin verilen kökenleri tanımlayın
const allowedOrigins = ['https://frontend.example.com', 'https://admin.example.com'];

app.use((req, res, next) => {
  const origin = req.headers.origin;
  
  // İstek kökeninin izin verilen listede olup olmadığını kontrol edin
  if (allowedOrigins.includes(origin)) {
    res.setHeader('Access-Control-Allow-Origin', origin);
  }

  // İzin verilen yöntemleri ve başlıkları tanımlayın
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  
  // Kimlik bilgilerine izin verin
  res.setHeader('Access-Control-Allow-Credentials', true);

  // Ön istekleri işleyin
  if (req.method === 'OPTIONS') {
    return res.sendStatus(204);
  }

  next();
});

Bu kod parçacığında, gelen Origin başlığını sıkı bir beyaz listeyle doğrulayarak * kullanmanın güvenlik riskinden kaçınırız. Ayrıca, istemcinin rastgele başlıklar göndermesini engellemek için bunları Allow-Headers içinde açıkça listeleriz. Ön istek kontrolü (OPTIONS isteği), gerçek veri istekleri için gereksiz işlemlerin önlenmesi için zarif bir şekilde işlenir.

Güvenli CORS İçin En İyi Uygulamalar

  1. Kimlik Bilgileriyle Asla Joker Karakter Kullanmayın: Dediğimiz gibi, Access-Control-Allow-Credentials: true ve Access-Control-Allow-Origin: *, uyumlu tarayıcılarda birbirini dışlayan değerlerdir.
  2. İzin Verilen Kökenleri En Aza İndirin: Tüm alanlara erişimi açmak yerine, her zaman belirli alanların bir beyaz listesini kullanın.
  3. Yöntemleri ve Başlıkları Kısıtlayın: API'nizin gerçekten ihtiyaç duyduğu HTTP yöntemlerini ve başlıklarını yalnızca ortaya çıkarın. Aşırı izin veren yapılandırmalar saldırı yüzeyini artırır.
  4. Ön İstekleri Doğru Şekilde İşleyin: Sunucunuzun, iş mantığınızı yürütmeden OPTIONS istekleri için 204 No Content veya 200 OK ile yanıt verdiğinden emin olun.
  5. Hassas Verileri Genel API'lerde Saklamayın: CORS, tarayıcı tarafından uygulanmış bir politikanın bir parçasıdır. Sunuculardan veya cURL gibi araçlardan doğrudan HTTP isteklerini engellemez. Bu nedenle, hassas sunucu tarafı verilerini korumak için CORS'a güvenmeyin; her zaman uygun kimlik doğrulama ve yetkilendirme uygulayın.

Sonuç

CORS, modern web uygulamalarının gerektirdiği işbirliğini sağlayan güçlü bir araçtır, ancak güvenliği korumak için dikkatli yapılandırma gerektirir. Altta yatan mekanizmaları anlayarak, spesifik başlıklar kullanarak ve en az ayrıcalık ilkesine uyarak, hem işlevsel hem de güvenli sağlam uygulamalar oluşturabilirsiniz. CORS'un savunmanın sadece bir katmanı olduğunu unutmayın; her zaman güçlü kimlik doğrulama, girdi doğrulama ve sunucu tarafı yetkilendirme kontrolleri ile tamamlayın.

Share: