Web sitenizin güvenliği, dijital varlığınızın en kritik bileşenlerinden biridir. Kullanıcı verilerini korumak, marka itibarını sağlamlaştırmak ve siber saldırılara karşı bir savunma hattı oluşturmak için atılması gereken birçok adım bulunmaktadır. Bu adımların en temel ve etkili olanlarından biri de HTTP güvenlik başlıklarını doğru bir şekilde yapılandırmaktır. Bu başlıklar, tarayıcılara sitenizle nasıl etkileşimde bulunmaları gerektiğini söyleyen sunucu talimatlarıdır ve modern web güvenliğinin temel taşlarını oluştururlar. Özellikle İçerik Güvenlik Politikası (Content Security Policy – CSP), bu başlıklar arasında en güçlü ve esnek olanıdır; sitenizin yalnızca güvendiğiniz kaynaklardan içerik yüklemesini sağlayarak birçok yaygın saldırı türünü proaktif olarak engeller.
İçerik Tablosu
Web Güvenliğinin Temeli: HTTP Güvenlik Başlıkları
Modern web uygulamalarının karmaşıklığı arttıkça, siber saldırganların hedef alabileceği potansiyel zafiyetlerin sayısı da artmaktadır. HTTP güvenlik başlıkları, bu tehditlere karşı ilk savunma hattını oluşturur. Sunucunuzun web sitenizi ziyaret eden tarayıcılara gönderdiği bu özel HTTP yanıt başlıkları, tarayıcının belirli güvenlik politikalarını zorunlu kılmasını sağlar. Bu sayede, potansiyel olarak tehlikeli içeriklerin yürütülmesi engellenir ve sitenizin hem kendisi hem de kullanıcıları için daha güvenli bir ortam oluşturulur.
HTTP Güvenlik Başlığı Nedir?
HTTP güvenlik başlıkları, bir web sunucusunun HTTP yanıtının başlık bölümünde gönderdiği, tarayıcı davranışını kontrol eden ve güvenlik politikalarını uygulayan özel direktiflerdir. Tarayıcı, bir web sayfasını yüklerken bu başlıkları okur ve içerdiği kurallara uyar. Örneğin, bir başlık tarayıcıya yalnızca güvenli (HTTPS) bağlantılar kullanmasını, sitenin başka siteler tarafından bir `
Neden Kritik Öneme Sahipler?
HTTP güvenlik başlıkları, savunma derinliği (defense-in-depth) stratejisinin hayati bir parçasıdır. Uygulama katmanındaki bir güvenlik açığı (örneğin, kullanıcı girdisinin yeterince temizlenmemesi) siber saldırganlar tarafından istismar edilse bile, doğru yapılandırılmış güvenlik başlıkları bu saldırının başarılı olma olasılığını büyük ölçüde azaltabilir. Kullanıcı verilerinin çalınmasını, sahte içerik enjeksiyonunu ve oturum hırsızlığını önleyerek hem site sahibi hem de son kullanıcı için bir güvence katmanı sağlarlar. Ayrıca, arama motorları güvenli siteleri tercih ettiğinden, bu başlıkların doğru kullanımı dolaylı olarak SEO performansına da olumlu etki edebilir.
Yaygın Web Saldırı Türlerine Genel Bakış (XSS, Clickjacking, vb.)
Güvenlik başlıklarının neden bu kadar önemli olduğunu anlamak için engelledikleri saldırı türlerini bilmek gerekir:
- Siteler Arası Betik Çalıştırma (Cross-Site Scripting – XSS): Saldırganın, hedef web sitesine kötü amaçlı bir betik enjekte ettiği ve bu betiğin başka bir kullanıcının tarayıcısında çalıştığı bir saldırı türüdür. XSS, oturum bilgilerini (cookie) çalmak, sayfa içeriğini değiştirmek veya kullanıcı adına işlemler yapmak için kullanılabilir.
- Tıklama Gaspı (Clickjacking): Saldırganın, kullanıcıyı kandırarak görünmez bir web sayfası üzerinde, aslında başka bir sitede bulunan bir butona veya linke tıklamasını sağladığı bir tekniktir. Örneğin, kullanıcı “sevimli kedi videosu izle” butonuna tıkladığını düşünürken, aslında arka planda farkında olmadan sosyal medya hesabından bir şeyi beğenmiş veya bir işlemi onaylamış olabilir.
- Protokol Düşürme Saldırıları (Protocol Downgrade Attacks): Saldırgan, kullanıcı ile sunucu arasındaki güvenli HTTPS bağlantısını güvensiz HTTP’ye düşürmeye çalışır. Bu, araya girerek (Man-in-the-Middle) verileri okumasına veya değiştirmesine olanak tanır.
- MIME Türü Karışıklığı (MIME-Type Sniffing): Tarayıcılar, bir dosyanın `Content-Type` başlığına güvenmek yerine içeriğini analiz ederek türünü tahmin etmeye çalışabilir. Bu durum, saldırganların zararsız gibi görünen bir dosyayı (örneğin bir resim) betik olarak yürütebilmesine yol açabilir.
Content Security Policy (CSP) Kavramı
HTTP güvenlik başlıkları arasında en kapsamlı ve güçlü olanı İçerik Güvenlik Politikası, yani CSP’dir. CSP, web sitenizin hangi kaynaklardan (script’ler, stiller, resimler, fontlar vb.) içerik yükleyebileceğini detaylı bir şekilde tanımlamanıza olanak tanıyan bir güvenlik standardıdır. Bu sayede, tarayıcıya yalnızca sizin onayladığınız kaynaklardan gelen içerikleri işlemesi ve diğer tüm istekleri engellemesi talimatını verirsiniz. Bu proaktif yaklaşım, özellikle XSS gibi içerik enjeksiyonu saldırılarına karşı son derece etkilidir.
CSP Nedir ve Nasıl Çalışır?
CSP, sunucunun HTTP yanıtına `Content-Security-Policy` adlı bir başlık eklemesiyle çalışır. Bu başlığın değeri, sitenin farklı türdeki içerikler için hangi kaynaklara izin verdiğini belirten bir dizi yönergeden (directive) oluşur. Örneğin, `script-src ‘self’ https://apis.google.com` yönergesi, tarayıcıya sadece sitenin kendi kaynağından (same-origin) ve `https://apis.google.com` adresinden gelen JavaScript dosyalarını çalıştırma izni verir. Başka herhangi bir kaynaktan gelen bir script’i yükleme girişimi tarayıcı tarafından engellenir ve genellikle tarayıcının geliştirici konsoluna bir ihlal raporu gönderilir.
CSP’nin Engellediği Temel Saldırı Vektörleri
CSP’nin birincil hedefi, kötü amaçlı içeriklerin web sayfanızda yürütülmesini engellemektir. Bu kapsamda en etkili olduğu saldırı türleri şunlardır:
- Siteler Arası Betik Çalıştırma (XSS): CSP, yalnızca güvenilir kaynaklardan script yüklenmesine izin vererek ve varsayılan olarak satır içi (inline) script’leri (`` veya `onclick=”…”`) engelleyerek XSS saldırılarının neredeyse tamamını etkisiz hale getirir.
- Veri Sızıntısı (Data Exfiltration): Kötü amaçlı bir kod, sayfanızdan veri çalmaya çalıştığında, CSP’nin `connect-src`, `form-action` gibi yönergeleri bu verilerin yetkisiz hedeflere gönderilmesini engelleyebilir.
- Clickjacking: `frame-ancestors` yönergesi kullanılarak, sitenizin hangi kaynaklar tarafından `
Beyaz Liste (Whitelist) Mantığı ve Güvenilir Kaynaklar
CSP, temel olarak bir “beyaz liste” (whitelist) veya daha modern bir deyişle “izin listesi” (allowlist) mantığına dayanır. Politikanızda açıkça izin vermediğiniz her şey varsayılan olarak yasaklanır. Bu “varsayılan olarak reddet” (deny-by-default) yaklaşımı, güvenliği en üst düzeye çıkarır. Güvenilir kaynakları belirlerken, sitenizin çalışması için gerekli olan tüm betik, stil, resim, font ve API sağlayıcılarını dikkatlice listelemeniz gerekir. Bu kaynaklar genellikle kendi alan adı (self), kullandığınız CDN’ler (Content Delivery Network), Google Analytics gibi analiz servisleri veya Google Fonts gibi font sağlayıcılarıdır.
CSP Politikasının Sunucuya Entegrasyon Yöntemleri
Bir CSP politikasını web sitenize entegre etmenin iki temel yolu vardır:
- HTTP Başlığı Yoluyla (Önerilen Yöntem): En yaygın ve etkili yöntem, web sunucusu yapılandırması (örneğin, Apache için `.htaccess`, Nginx için `nginx.conf`) veya sunucu tarafı bir betik (PHP, Node.js vb.) aracılığıyla `Content-Security-Policy` HTTP başlığını her yanıta eklemektir. Bu, sitenin tüm sayfaları için merkezi bir politika yönetimi sağlar.
- Meta Etiketi Yoluyla: Politika, sayfanın HTML kodunun `` bölümüne bir `` etiketi eklenerek de belirtilebilir: ``. Ancak bu yöntemin bazı kısıtlamaları vardır; örneğin, `frame-ancestors`, `report-uri` gibi bazı önemli yönergeleri desteklemez ve sadece o belirli HTML sayfası için geçerlidir. Bu nedenle genellikle HTTP başlığı yöntemi tercih edilir.
Temel CSP Yönergeleri (Directives) ve Anlamları
Bir Content Security Policy (CSP), sitenizin hangi kaynaklara erişebileceğini tanımlayan bir dizi yönergeden (directive) oluşur. Her yönerge, belirli bir kaynak türünü (örneğin, script’ler veya stiller) kontrol eder. Bu yönergeleri doğru bir şekilde anlamak ve yapılandırmak, etkili ve kırılgan olmayan bir güvenlik politikası oluşturmanın anahtarıdır.
`default-src`: Varsayılan Kaynak Politikası
`default-src`, CSP politikanızın bel kemiğidir. Eğer `script-src`, `style-src` gibi daha spesifik bir yönerge belirtilmemişse, tarayıcı bu yönergenin değerini o kaynak türü için varsayılan olarak kullanır. Bu, genellikle politikanızı basitleştirmek için kullanılır. Örneğin, tüm kaynakların yalnızca kendi alan adınızdan yüklenmesine izin vermek için `default-src ‘self’;` kuralını belirleyebilirsiniz. Bu, en kısıtlayıcı başlangıç noktasıdır ve daha sonra ihtiyaç duyulan diğer kaynaklar için özel izinler eklenir.
`script-src`: JavaScript Dosyaları İçin Güvenlik
Belki de en önemli CSP yönergesi olan `script-src`, hangi kaynaklardan JavaScript dosyalarının yüklenebileceğini ve yürütülebileceğini kontrol eder. XSS saldırılarını önlemedeki birincil araçtır. Örneğin, `script-src ‘self’ https://cdn.example.com;` kuralı, sitenin kendi kök dizininden ve `cdn.example.com` adresinden gelen betiklere izin verir, diğer tüm kaynakları engeller. Varsayılan olarak inline script’leri (``) ve `eval()` gibi fonksiyonları engeller.
`style-src`: CSS Dosyaları İçin Güvenlik
`style-src`, hangi kaynaklardan CSS dosyalarının ve stillerin yüklenebileceğini tanımlar. Kötü amaçlı bir stil dosyasının, sayfanın düzenini değiştirerek veya veri sızdırmaya yönelik CSS enjeksiyonu saldırılarıyla kullanıcıları yanıltmasını engelleyebilir. `style-src ‘self’ https://fonts.googleapis.com;` gibi bir kural, yerel stillere ve Google Fonts tarafından sağlanan stillere izin verir.
`img-src`: Görsel Dosyaları İçin Kaynak Belirleme
Bu yönerge, resimlerin (``, `background-image` vb.) hangi kaynaklardan yüklenebileceğini kontrol eder. Bu, yetkisiz veya uygunsuz görsellerin sitenizde gösterilmesini engeller. Örneğin, `img-src ‘self’ data: https://img.example.com;` kuralı, yerel görsellere, base64 formatında kodlanmış satır içi (inline) görsellere (`data:`) ve `img.example.com` alan adından gelen görsellere izin verir.
`font-src`: Yazı Tipi Dosyalarının Kontrolü
Web sitenizde kullanılan özel yazı tiplerinin (fontların) hangi kaynaklardan yüklenebileceğini `font-src` yönergesi ile belirlersiniz. Bu, genellikle Google Fonts gibi harici font hizmetlerini veya kendi sunucunuzdaki font dosyalarını beyaz listeye eklemek için kullanılır. Örnek: `font-src ‘self’ https://fonts.gstatic.com;`.
`connect-src`: API ve AJAX İsteklerinin Yönetimi
`connect-src`, `XMLHttpRequest`, `Fetch API`, `WebSocket` ve `EventSource` gibi komut dosyası arayüzleri tarafından yapılabilecek bağlantıları kısıtlar. Yani, sayfanızdaki JavaScript’in hangi API uç noktalarına veya sunuculara istek gönderebileceğini kontrol eder. Bu, verilerinizin yetkisiz sunuculara sızdırılmasını önlemek için kritik bir yönergedir.
`frame-src`: Iframe İçeriklerinin Kısıtlanması
Bu yönerge, sayfanızda `
`media-src`: Ses ve Video Dosyalarının Kontrolü
`media-src`, `
Gelişmiş CSP Yapılandırması ve Yönergeleri
Temel CSP yönergeleri web sitenizin güvenliğini önemli ölçüde artırırken, modern web uygulamalarının dinamik doğası genellikle daha karmaşık ve esnek politikalara ihtiyaç duyar. Gelişmiş CSP yönergeleri, güvenlikten ödün vermeden bu esnekliği sağlamak, politika ihlallerini izlemek ve clickjacking gibi daha sofistike saldırılara karşı koruma sağlamak için tasarlanmıştır.
`report-uri` ve `report-to`: İhlal Raporlaması
Bir CSP politikasını ilk kez uygularken, sitenin bazı işlevlerini yanlışlıkla bozma riski vardır. İhlal raporlaması, bu sorunu çözmek için kritik bir araçtır.
- `report-uri` (Kullanımdan Kalkıyor): Bu yönerge, CSP politikasını ihlal eden bir durum oluştuğunda tarayıcının JSON formatında bir rapor göndereceği bir URL belirtir. Bu raporlar, engellenen kaynağı, ihlal edilen yönergeyi ve sayfanın URL’sini içerir. Bu sayede, politikanızı canlıya almadan önce hangi kaynakların eksik olduğunu tespit edip düzeltebilirsiniz.
- `report-to`: `report-uri`’nin yerini alan daha modern ve esnek bir yönergedir. Reporting API ile birlikte çalışarak, raporların nasıl ve nereye gönderileceği konusunda daha fazla kontrol sağlar.
`nonce` Kullanımı: Tek Seferlik Inline Script İzinleri
CSP, varsayılan olarak güvenlik nedeniyle satır içi (inline) betikleri (``) engeller. Ancak bazen, özellikle eski sistemlerle çalışırken, inline script kullanmak kaçınılmaz olabilir. `nonce` (number used once – bir kez kullanılan sayı) bu soruna güvenli bir çözüm sunar. Sunucu, her sayfa isteği için kriptografik olarak güvenli, rastgele bir `nonce` değeri üretir. Bu değer hem CSP başlığındaki `script-src` yönergesine hem de izin verilecek inline ``
Tarayıcı, yalnızca `nonce` değeri başlıktaki değerle eşleşen inline script'i çalıştırır.
`hash` Kullanımı: Belirli Script ve Style Bloklarına İzin Verme
`hash` kullanımı, `nonce`'a bir alternatiftir ve statik inline script veya style bloklarına izin vermek için kullanılır. Sunucu, izin verilecek inline kod bloğunun içeriğinin bir kriptografik özetini (SHA256, SHA384 veya SHA512) hesaplar. Bu özet değeri, CSP başlığındaki ilgili yönergeye eklenir.
Örnek:
CSP Başlığı: `Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng=';`
Tarayıcı, sayfadaki inline script'lerin özetini hesaplar ve başlıkta belirtilen özetle eşleşenleri çalıştırır. Bu yöntem, kodun içeriği değişmediği sürece geçerlidir.
`unsafe-inline` ve `unsafe-eval` Kullanımının Riskleri
Bazen geliştiriciler, CSP'yi hızlıca uygulamak için `unsafe-inline` ve `unsafe-eval` anahtar kelimelerini kullanma yoluna gidebilirler.
- `unsafe-inline`: Tüm inline script (`

