Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

CORS politikasını sadece belirli origin'lere izin verecek şekilde nasıl sınırlandırırım?

pixero

Üye
Katılım
14 Mart 2026
Mesajlar
41
Merhaba arkadaşlar, bugün başımı çok ağrıtan ve güvenlik testlerinde sık sık karşımıza çıkan bir konudan bahsedeceğim: CORS. Özellikle API'nizi herkese açık bir şekilde sunmak istemediğinizde, sadece güvendiğiniz domain'lerin (origin'lerin) istek yapmasına izin vermek çok önemli. Bu hatayı ilk gördüğümde "Access-Control-Allow-Origin" hatası alıp kafayı yemiştim, ama çözüm aslında oldukça basit.

🔥 Karşılaştığım Sorun
Bir Laravel API projem vardı ve sadece kendi frontend uygulamamın (örneğin,
Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.
) bu API'ye erişmesini istiyordum. Ancak, CORS ayarlarını yapmazsanız, tarayıcı güvenlik politikaları gereği başka bir domain'den gelen istekler otomatik olarak engelleniyor. Hatta, kötü niyetli script'lerin API'nizi kötüye kullanması da mümkün hale geliyordu. "Her şeye izin ver" (Access-Control-Allow-Origin: ) demek ise kesinlikle güvenli bir çözüm değil.

🔧 Laravel ile Çözüm (Middleware Kullanımı)
Laravel'de bu iş için hazır bir paket var: fruitcake/laravel-cors. Ancak, ben daha fazla kontrol sağlamak için özelleştirilmiş bir middleware yazmayı tercih ediyorum. İşte benim kullandığım en temiz çözüm.

Öncelikle, bir CORS middleware'i oluşturalım:
PHP:
<?php

namespace App\Http\Middleware;

use Closure;

class RestrictCors
{
    public function handle($request, Closure $next)
    {
        // İzin verilen origin'leri bu diziye ekleyin.
        $allowedOrigins = [
            'https://uygulamam.com',
            'https://guvenli-test-alani.net',
        ];

        $origin = $request->headers->get('Origin');

        // Eğer isteğin origin'i izin verilenler listesindeyse, header'ı ekle.
        if (in_array($origin, $allowedOrigins)) {
            return $next($request)
                ->header('Access-Control-Allow-Origin', $origin)
                ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE, OPTIONS')
                ->header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With')
                ->header('Access-Control-Allow-Credentials', 'true');
        }

        // Origin izin verilenlerde değilse, varsayılan yanıtı döndür (isteğe bağlı olarak hata fırlatabilirsiniz).
        return response('Origin not allowed', 403);
    }
}

Sonrasında, bu middleware'i `app/Http/Kernel.php` dosyasındaki `$middleware` dizisine veya spesifik route gruplarına ekleyebilirsiniz.

🌐 Node.js (Express) ile Çözüm
Eğer Node.js ve Express kullanıyorsanız, `cors` paketi ile bu işlem çok kolay. Ama yine de sadece belirli origin'lere izin vermek için özelleştirme yapmalısınız.

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

// İzin verilen origin listesi
const allowedOrigins = ['https://uygulamam.com', 'https://guvenli-test-alani.net'];

const corsOptions = {
  origin: function (origin, callback) {
    // Eğer origin yoksa (örneğin, aynı origin'den veya bir tool'dan geliyorsa) veya listedeyse izin ver.
    if (!origin || allowedOrigins.indexOf(origin) !== -1) {
      callback(null, true);
    } else {
      callback(new Error('CORS policy violation: Origin not allowed'));
    }
  },
  credentials: true, // Cookie veya auth header'ları için gerekli
  methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization']
};

app.use(cors(corsOptions));

// OPTIONS isteklerini de handle etmek iyi olur (preflight için)
app.options('', cors(corsOptions));

// ... Route'larınız burada
app.get('/api/data', (req, res) => {
  res.json({ message: 'Sadece güvenli originlerden erişilebilir data!' });
});

app.listen(3000, () => console.log('Sunucu 3000 portunda çalışıyor.'));
Bu yapıda, allowedOrigins dizisini kendi domain'lerinizle güncellemeyi unutmayın!

💎 Son Sözler ve Güvenlik Notu
CORS, bir güvenlik duvarı DEĞİLDIR. Sunucu tarafında mutlaka kimlik doğrulama (authentication) ve yetkilendirme (authorization) kontrollerinizi de yapın. CORS sadece tarayıcı tabanlı saldırıları (CSRF gibi) hafifletmeye yardımcı olur.

Siz bu ayarları yaparken farklı bir yöntem veya paket mi kullanıyorsunuz? Özellikle production ortamında CORS konusunda başka hangi güvenlik önlemlerini alıyorsunuz? Deneyimlerinizi yorumlarda paylaşırsanız çok sevinirim!
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri