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 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:
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.
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!
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.
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.
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.'));
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!