Ana Karargâh Neler Yapıyoruz?
Hikayemizin Perde Arkası Beyin Kıvılcımları Bağlantıya Geçin

Same-Origin Policy ve CORS: Güvenli Kaynak Paylaşımı

Merhaba değerli okuyucular! Bugün, web güvenliğinin temel taşlarından olan Same-Origin Policy (Aynı Köken Politikası) ve bu politikanın getirdiği kısıtlamaları aşmak için kullanılan Cross-Origin Resource Sharing (CORS) mekanizmasını derinlemesine inceleyeceğiz. Bu kritik güvenlik konseptlerinin nasıl çalıştığını ve web uygulamalarınızda nasıl doğru bir şekilde uygulayabileceğinizi ele alacağız. Hazırsanız, web güvenliğinin bu önemli konusuna dalalım!

Same-Origin Policy Nedir?

Same-Origin Policy, web tarayıcıları tarafından uygulanan bir güvenlik mekanizmasıdır. Bu politika, bir kaynaktan (örneğin, bir web sayfası) yüklenen bir script'in, yalnızca aynı kökenden (origin) gelen kaynaklara erişebilmesini sağlar. Burada "köken", şu üç bileşenin kombinasyonudur:

  • Protokol (http, https)
  • Alan adı (domain)
  • Port numarası

Örnek:


// Aynı köken
https://example.com/page1.html
https://example.com/page2.html

// Farklı kökenler
https://example.com/page1.html
http://example.com/page2.html (farklı protokol)
https://api.example.com/data.json (farklı alt alan)
https://example.com:8080/page2.html (farklı port)

Same-Origin Policy'nin Önemi

Same-Origin Policy, web güvenliğinde kritik bir rol oynar. Bu politika sayesinde:

  • Kötü niyetli siteler, başka sitelerin hassas verilerine erişemez.
  • Cross-Site Scripting (XSS) saldırılarının etki alanı sınırlanır.
  • Kullanıcı gizliliği korunur.

CORS (Cross-Origin Resource Sharing) Nedir?

CORS, Same-Origin Policy'nin getirdiği kısıtlamaları güvenli bir şekilde aşmak için kullanılan bir mekanizmadır. CORS, bir sunucunun, kendi kaynaklarına farklı kökenlerden erişime izin vermesini sağlar.

CORS Nasıl Çalışır?

  1. Tarayıcı, farklı bir kökene yapılan isteğe otomatik olarak bir "Origin" başlığı ekler.
  2. Sunucu, bu isteğe "Access-Control-Allow-Origin" başlığı ile cevap verir.
  3. Tarayıcı, bu başlığı kontrol eder ve erişime izin verilip verilmediğine karar verir.

CORS Uygulaması

1. Sunucu Tarafında CORS Yapılandırması (Node.js/Express örneği)


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

// Tüm kökenlere izin ver
app.use(cors());

// veya belirli bir kökene izin ver
app.use(cors({
    origin: 'https://example.com'
}));

app.get('/api/data', (req, res) => {
    res.json({ message: 'CORS-enabled data' });
});

app.listen(3000, () => console.log('Server running on port 3000'));

2. PHP ile CORS Başlıkları


<?php
// Tüm kökenlere izin ver
header("Access-Control-Allow-Origin: *");

// veya belirli bir kökene izin ver
header("Access-Control-Allow-Origin: https://example.com");

// İzin verilen metodlar
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");

// İzin verilen başlıklar
header("Access-Control-Allow-Headers: Content-Type, Authorization");

// Yanıt
echo json_encode(["message" => "CORS-enabled data"]);
?>

3. Client Tarafında CORS İsteği (JavaScript)


fetch('https://api.example.com/data', {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    },
    // CORS için özel ayarlar gerekli değil, tarayıcı otomatik olarak yönetir
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));

CORS Güvenlik Önlemleri

1. Origin Sınırlaması

Mümkün olduğunca spesifik origin tanımlamaları yapın.


// Yanlış (çok geniş)
header("Access-Control-Allow-Origin: *");

// Doğru (spesifik)
header("Access-Control-Allow-Origin: https://trusted-site.com");

2. Credentials Kontrolü

Kimlik bilgileri (cookies, HTTP authentication) içeren istekler için özel dikkat gösterin.


// Sunucu tarafı
header("Access-Control-Allow-Credentials: true");

// Client tarafı
fetch('https://api.example.com/data', {
    credentials: 'include'
})

3. Preflight İsteklerini Doğru Yönetme

OPTIONS metoduyla gelen preflight isteklerini doğru şekilde yanıtlayın.


if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
    header("Access-Control-Allow-Headers: Content-Type, Authorization");
    exit(0);
}

4. Content-Type Kontrolü

İzin verilen content type'ları sınırlayın.


header("Access-Control-Allow-Headers: Content-Type");

CORS ve Same-Origin Policy ile İlgili Yaygın Hatalar

1. CORS'u Tamamen Devre Dışı Bırakmak

CORS kısıtlamalarını tamamen kaldırmak, güvenlik açıklarına neden olabilir.

2. Yanlış Wildcard Kullanımı

* wildcard'ını dikkatli kullanın. Özellikle credentials ile birlikte kullanılamaz.

3. Gereksiz Yere Geniş İzinler Vermek

Sadece gerekli metodlara ve başlıklara izin verin.

4. HTTPS ve HTTP Karışımı

Güvenli (HTTPS) bir siteden güvensiz (HTTP) bir kaynağa erişim sorunlar yaratabilir.

CORS ve Same-Origin Policy'nin Geleceği

Web güvenliği sürekli evrim geçiriyor. İşte gelecekte beklenen bazı gelişmeler:

  • Daha Granüler Kontroller: Kaynağa, yola veya metoda özel CORS politikaları.
  • Web Workers ve Service Workers ile Entegrasyon: Offline uygulamalar için daha iyi CORS desteği.
  • Content Security Policy (CSP) ile Daha Sıkı Entegrasyon: CORS ve CSP'nin birlikte daha etkili kullanımı.
  • Otomatik CORS Yönetimi: Frameworklerin ve platformların daha akıllı CORS yönetimi.

Güvenli ve Esnek Web Uygulamaları için CORS ve Same-Origin Policy

Same-Origin Policy ve CORS, modern web uygulamalarının güvenliğinde kritik bir rol oynar. Bu mekanizmalar, web sitelerinin güvenliğini sağlarken, aynı zamanda gerektiğinde farklı kökenler arası iletişime de izin verir.

Doğru uygulandığında, CORS ve Same-Origin Policy:

  • Uygulamalarınızı XSS ve CSRF gibi saldırılara karşı korur.
  • Kullanıcı verilerinin gizliliğini sağlar.
  • Farklı domainler arası güvenli veri paylaşımına olanak tanır.
  • Mikroservis mimarilerinde ve dağıtık sistemlerde güvenli iletişim sağlar.

Ancak, bu mekanizmaları doğru bir şekilde uygulamak ve yönetmek önemlidir. Gereğinden fazla kısıtlayıcı politikalar uygulamanızın işlevselliğini etkileyebilirken, çok gevşek politikalar güvenlik açıklarına neden olabilir.


class CORSManager {
    private $allowedOrigins = ['https://trusted-site.com', 'https://another-trusted-site.com'];
    private $allowedMethods = ['GET', 'POST', 'OPTIONS'];
    private $allowedHeaders = ['Content-Type', 'Authorization'];

    public function handleRequest() {
        $origin = $_SERVER['HTTP_ORIGIN'] ?? '';

        if (in_array($origin, $this->allowedOrigins)) {
            header("Access-Control-Allow-Origin: $origin");
            header("Access-Control-Allow-Methods: " . implode(', ', $this->allowedMethods));
            header("Access-Control-Allow-Headers: " . implode(', ', $this->allowedHeaders));

            if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
                exit(0);
            }
        }

        // Normal request processing continues...
    }
}

$corsManager = new CORSManager();
$corsManager->handleRequest();

// Your application logic here...

Siz uygulamalarınızda CORS ve Same-Origin Policy'yi nasıl yönetiyorsunuz? Karşılaştığınız zorluklarla ilgili deneyimlerinizi paylaşın. Farklı kökenler arası iletişim gerektiren projelerinizde hangi stratejileri kullanıyorsunuz? Yorumlarınızı bekliyoruz!

Güvenli kodlamalar ve her zaman kontrollü kaynak paylaşımları!