🐹 Mustafa ile Öğreniyorum #26 — Siteler Arası Gizli Geçit: CORS (Cross-Origin Resource Sharing) Zafiyeti Herkese Selamlar, Bugün web geliştirme yaparken en az bir kez karşılaştığımız, kimimizin detayını bildiği kimimizin ise es geçtiği bir kavramın nasıl ciddi bir güvenlik zafiyetine dönüşebileceğini ele alıyoruz: CORS (Cross-Origin Resource Sharing) Zafiyeti. İnternette gezinirken aynı anda onlarca sekme açarsınız. Arka sekmede banka hesabınız veya e-posta kutunuz açık dururken, yan sekmede bilmediğiniz bir haber sitesinde dolaşabilirsiniz. Peki, yan sekmedeki sitenin arka sekmedeki özel verilerinizi okumasını engelleyen şey nedir? Gelin, web tarayıcılarının bu görünmez muhafızını ve yapılan hataları adım adım inceleyelim: Tarayıcının Altın Kuralı (SOP - Same-Origin Policy): Tarayıcılar varsayılan olarak "Aynı Köken Politikası" uygular. Yani kötüsite.com adresindeki bir kod, bankam.com adresindeki verilerinizi okuyamaz. Köken (Origin); protokol, alan adı ve port üçlüsünden oluşur. Yani "her koyun kendi bacağından asılır" misali... Bu kural internetin temel güvenlik kalkanıdır. CORS Neden Var? (İhtiyaçtan Doğan Kapı): Modern web uygulamalarında app.bankam.com, verilerini api.bankam.com adresinden çekmek zorundadır. Farklı alan adları güvenle haberleşebilsin diye tarayıcılara esneklik getiren CORS standartlaştırılmıştır. Sunucu kısaca "Şu sitelerin benden veri çekmesine izin veriyorum" der. Kırılma Noktası (Geliştirici Hataları): Esneklik sağlarken yapılan en büyük hata, sunucunun kapıyı herkese sonuna kadar açmasıdır. Geliştirici test yaparken veya hata mesajıyla uğraşmak istemediğinde Access-Control-Allow-Origin: * (herkese izin ver) başlığını tanımlar. Tehlikeli Kombinasyon (Reflected Origin & Credentials): Çok daha tehlikeli senaryolardan birinde sunucu, gelen isteğin Origin değerini güvenilir olup olmadığını kontrol etmeden Access-Control-Allow-Origin başlığına yansıtır ve Access-Control-Allow-Credentials: true başlığını da ekler. Böylece saldırganın kontrol ettiği bir site, kullanıcının oturum bilgileriyle yapılan isteğin yanıtını okuyabilir. Bu durum, kullanıcının kimlik doğrulama yöntemine ve sunucunun diğer güvenlik kontrollerine bağlı olarak hassas verilerin açığa çıkmasına yol açabilir. Saldırı Senaryosu: Siz zararsız görünen kötüsite.com adresine girdiğinizde, arka planda çalışan JavaScript kodu bankam.com adresindeki API'ye sizin tarayıcınız üzerinden istek göndermeyi deneyebilir. Sunucunun CORS yapılandırması hatalıysa ve diğer koşullar da uygunsa tarayıcı, hassas bilgileri içeren yanıtın kötü niyetli site tarafından okunmasına izin verebilir. 📌 Siber Güvenlik Dersi: CORS tek başına bir zafiyet değil, bir güvenlik mekanizmasıdır. Zafiyeti oluşturan şey, tarayıcının sunduğu bu denetim kapısını sunucu tarafında bilinçsizce esnetmektir. Nasıl Engellenir? Wildcard (*) Kullanımını Doğru Değerlendirin: Hassas veya kullanıcıya özel veriler döndüren API'lerde gelişigüzel wildcard ya da doğrulanmadan yansıtılan Origin değerleri kullanmayın. Herkese açık, kimlik doğrulaması gerektirmeyen kaynaklarda wildcard uygun olabilir. Katı Whitelist (Beyaz Liste): Sadece güvenilen, izinli alan adlarının bulunduğu katı bir Origin kontrolü yapılmalıdır. Credentials Kontrolü: Access-Control-Allow-Credentials: true başlığı sadece gerçekten zorunlu olan ve beyaz listede yer alan güvenilir kökenlere sunulmalıdır. "Tarayıcı sınırlarını esnetirken bıraktığınız küçük bir aralık, saldırgan için devasa bir kapıya dönüşebilir." 💬 Mustafa soruyor: Web geliştirmeyle uğraşırken CORS hatası alıp internette aratırken Access-Control-Allow-Origin: * çözümünü görüp doğrudan projesine ekleyen oldu mu? Yorumlarda buluşalım! 👇