REST API'ler, modern web ve mobil uygulamaların omurgasını oluşturuyor. Aynı zamanda saldırganların en çok hedef aldığı yüzeylerden biri de API'ler: Tarayıcı arayüzünün arkasına gizlenmedikleri için uç noktaları kolayca keşfedilir, otomatik araçlarla taranır ve zayıf noktaları sistematik biçimde denenir. Laravel, güvenli bir API geliştirmek için gereken yapı taşlarının neredeyse tamamını çekirdeğinde veya birinci parti paketlerinde sunar; ancak bu araçların doğru yapılandırılması geliştiricinin sorumluluğundadır. Bu rehberde, üretim ortamına çıkacak bir Laravel API'sinin güvenlik kontrol listesini katman katman ele alıyoruz.
Kimlik Doğrulama: Sanctum mı, Passport mı?
İlk karar noktası kimlik doğrulama mekanizmasıdır. Laravel ekosisteminde iki birinci parti çözüm öne çıkar:
- Laravel Sanctum: SPA'lar, mobil uygulamalar ve basit token tabanlı API'ler için hafif ve pratik bir çözümdür. Çoğu proje için doğru tercih budur. SPA senaryosunda çerez ve oturum tabanlı, durum bilgisi olan (stateful) doğrulama; mobil ve üçüncü parti senaryolarında ise kişisel erişim tokenları sunar.
- Laravel Passport: Tam kapsamlı bir OAuth2 sunucusudur. Üçüncü parti uygulamaların kullanıcılar adına yetki almasını gerektiren senaryolarda (authorization code, client credentials akışları) gereklidir. Bu ihtiyaç yoksa Passport'un getirdiği karmaşıklık gereksizdir.
Sanctum kullanırken token'lara yetenek (ability) tanımlamayı ihmal etmeyin: Salt okuma amaçlı bir entegrasyon token'ı, yazma uçlarına erişememelidir. Token'ların son kullanma süresini yapılandırmak ve kullanılmayan token'ları düzenli temizlemek de saldırı yüzeyini daraltır.
Yetkilendirme: Policy ve Gate Kullanımı
Kimlik doğrulama "sen kimsin" sorusunu, yetkilendirme ise "buna yetkin var mı" sorusunu yanıtlar. API güvenlik açıklarının en yaygını, OWASP API Top 10 listesinin de ilk sırasında yer alan nesne düzeyinde kırık yetkilendirmedir (BOLA): Kullanıcının, URL'deki kimlik numarasını değiştirerek başkasının kaydına erişebilmesi. Laravel'de bu riskin sistematik çözümü Policy sınıflarıdır. Her model için bir Policy tanımlayın ve denetleyicilerde authorize() çağrısını veya route model binding ile birlikte can middleware'ini kullanın. Sorgularınızı da her zaman erişim kapsamıyla başlatın: auth()->user()->projects() gibi ilişki üzerinden başlayan bir sorgu, yanlışlıkla tüm tabloyu açmaz.
Girdi Doğrulama ve Toplu Atama Koruması
Hiçbir istemci verisine güvenmeyin. Form Request sınıfları, doğrulama kurallarını denetleyiciden ayırarak hem okunabilirlik hem de tutarlılık sağlar. Doğrulamada izin verici değil kısıtlayıcı olun: Beklediğiniz alanları, türleri ve sınırları açıkça tanımlayın. Toplu atama (mass assignment) saldırılarına karşı modellerde $fillable listesini bilinçli tutun ve istek verisini asla doğrudan $request->all() ile modele geçirmeyin; $request->validated() kullanın. Eloquent zaten parametre bağlama ile SQL enjeksiyonuna karşı koruma sağlar; ham sorgu yazmanız gerekiyorsa mutlaka bağlı parametrelerle çalışın.
Hız Sınırlama ile Kötüye Kullanımı Engelleyin
Hız sınırlama (rate limiting); kaba kuvvet parola denemelerini, veri kazımayı ve kaynak tüketim saldırılarını frenleyen temel kontroldür. Laravel'in RateLimiter altyapısı esnek tanımlara izin verir:
- Giriş ve parola sıfırlama uçlarına, genel uçlardan çok daha sıkı limitler uygulayın; limiti IP ve kullanıcı adı kombinasyonuna göre tanımlayın.
- Kimliği doğrulanmış kullanıcılar için kullanıcı bazlı, anonim trafik için IP bazlı limit belirleyin.
- Pahalı uçlara (rapor üretimi, dışa aktarma) ayrı ve düşük limitler tanımlayın.
- Limit aşıldığında dönen 429 yanıtının
Retry-Afterbaşlığı içerdiğinden emin olun; iyi niyetli istemciler buna göre davranır.
Hata Yönetimi ve Bilgi Sızıntısı
Üretim ortamında APP_DEBUG değerinin false olması pazarlık konusu değildir; aksi halde tek bir hata sayfası, veritabanı kimlik bilgilerine kadar her şeyi sızdırabilir. API yanıtlarında iç hata ayrıntılarını değil, standartlaştırılmış hata gövdeleri döndürün. "Kullanıcı bulunamadı" ile "parola hatalı" ayrımı yapmayan genel mesajlar kullanarak hesap keşfini zorlaştırın. Ayrıca yanıtlarınızı API Resource sınıflarıyla şekillendirin: Modeli doğrudan JSON'a çevirmek, ileride eklenecek hassas bir sütunun farkında olmadan dışarı açılması demektir.
Aktarım Güvenliği ve Başlıklar
Tüm API trafiği yalnızca HTTPS üzerinden akmalıdır; HTTP isteklerini yönlendirmek yerine reddetmek API'lerde daha doğru bir davranıştır. HSTS başlığını etkinleştirin, CORS yapılandırmasında izin verilen kaynakları (origin) joker karakter yerine açık liste olarak tanımlayın. Çerez tabanlı SPA doğrulaması kullanıyorsanız SameSite, Secure ve HttpOnly bayraklarının doğru ayarlandığından emin olun; CSRF korumasını devre dışı bırakmayın.
Gizli Anahtar ve Yapılandırma Yönetimi
API anahtarları, veritabanı parolaları ve üçüncü parti servis kimlik bilgileri asla sürüm kontrolüne girmemelidir. .env dosyasının depoya eklenmediğinden emin olun ve örnek değerleri .env.example ile paylaşın. Üretim ortamında yapılandırma önbelleğini (config:cache) kullanın ve kod içinde env() yerine config() çağrılarına bağlı kalın. Daha hassas kurulumlarda gizli anahtarları bir kasa çözümünde (vault) tutmak ve dağıtım sırasında enjekte etmek, hem erişim denetimi hem de anahtar rotasyonu açısından çok daha sağlıklıdır. Üçüncü parti webhook'ları alıyorsanız, gelen isteklerin imzasını (HMAC) mutlaka doğrulayın; kendi webhook'larınızı gönderirken de aynı imza mekanizmasını sunun.
API Sürümleme ve Kullanımdan Kaldırma
Güvenlikle doğrudan ilişkili görünmese de sürümleme, eski ve savunmasız uçların kontrolsüz biçimde yaşamaya devam etmesini önleyen bir disiplindir. URL tabanlı sürümleme (/api/v1/...) Laravel'de route gruplarıyla kolayca uygulanır. Yeni sürüme geçerken eskisini hemen kapatmak yerine, kullanım metriklerini izleyerek planlı bir kullanımdan kaldırma (deprecation) süreci işletin: Yanıt başlıklarıyla istemcileri bilgilendirin, belirlenen tarihte eski sürümü devre dışı bırakın. Unutulan ve izlenmeyen "zombi" uçlar, API güvenliğinin en sessiz açıklarındandır.
İzleme, Loglama ve Sürekli Test
Güvenlik, dağıtımla biten bir iş değildir. Başarısız giriş denemelerini, yetkilendirme hatalarını ve hız limiti aşımını yapılandırılmış loglarla kaydedin; bu olaylar için eşik tabanlı uyarılar kurun. Loglara token, parola veya kişisel veri yazılmadığından emin olun; KVKK açısından log dosyaları da kişisel veri barındıran sistemlerdir. Bağımlılıklarınızı composer audit ile düzenli tarayın, statik analiz araçlarını (PHPStan, Larastan) CI hattınıza ekleyin. Yetkilendirme kurallarınızı feature testleriyle güvence altına alın: "B kullanıcısı, A kullanıcısının kaydını okuyamamalı" senaryosu, yazması en kolay ama atlandığında en pahalıya mal olan testtir. Kritik API'lerde yılda en az bir kez bağımsız sızma testi yaptırmak, kör noktaları ortaya çıkarmanın en etkili yoludur.
Sonuç
Laravel, güvenli API geliştirme için olgun bir araç seti sunar; ancak güvenlik, çatının değil ekibin disiplinidir. Kimlik doğrulamayı doğru kurgulamak, her uçta yetkilendirme denetimi yapmak, girdiyi sıkı doğrulamak ve kötüye kullanımı hız limitleriyle frenlemek, API'nizin saldırı yüzeyini büyük ölçüde daraltır. OPEIS Teknoloji olarak, Laravel tabanlı kurumsal uygulamalar geliştiriyor ve mevcut API'ler için güvenlik denetimi hizmetleri sunuyoruz. API güvenliğinizi değerlendirmek için bizimle iletişime geçebilirsiniz.