HTTP yanıt başlıkları, tarayıcıya sayfalarınızı nasıl ele alacağını söyler: hangi betiklerin çalışabileceğini, sitenin bir çerçeve içinde gösterilip gösterilemeyeceğini ve her zaman HTTPS üzerinden yüklenmesi gerekip gerekmediğini. Bunların birkaçı, neredeyse hiçbir maliyet olmadan bütün bir saldırı sınıfını engeller. Diğerleri artık kullanılmıyor ve yalnızca kalabalık, hatta risk yaratıyor.
Başlangıç için temel yapılandırma
Aşağıdaki yapılandırma, yalnızca HTTPS üzerinden sunulan bir HTML uygulaması için makul bir başlangıç noktasıdır. Olduğu gibi kopyalamayın. Özellikle CSP, sayfalarınızın betikleri yükleme şekline uymalıdır; nonce değeri her yanıtta yeni olmalıdır; HSTS preload’ı geri almak ise zordur.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Content-Security-Policy: script-src 'nonce-3f9a1c7e2b' 'strict-dynamic'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), camera=(), microphone=()
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-site
Content-Security-Policy
CSP, betiklerin ve diğer kaynakların nereden gelebileceğini sınırlar. Asıl görevi siteler arası betik çalıştırma (XSS) açıklarının istismarını çok daha zor hâle getirmektir.
OWASP CSP cheat sheet’i, izin verilen alan adlarından oluşan uzun bir liste yerine nonce ya da hash değerlerine dayanan sıkı (strict) bir politikayı tercih eder. Fazla geniş ya da fazla ayrıntılı izin listesi politikaları genellikle atlatılır. Nonce tabanlı bir politika şöyle görünür:
Content-Security-Policy: script-src 'nonce-3f9a1c7e2b' 'strict-dynamic'; object-src 'none'; base-uri 'none'
Ardından her script etiketi aynı değeri taşır; örneğin <script nonce="3f9a1c7e2b">. Nonce rastgele olmalı ve her yanıtta yeniden üretilmelidir; sabit bir değer amacı boşa çıkarır. Nonce’u şablon katmanınızda üretin. OWASP, nonce’u her script etiketine ekleyen ara katman yazılımlarına (middleware) karşı uyarır, çünkü bu yöntem sayfaya sokulan betikleri de onaylamış olur.
Sayfalarınız statikse bunun yerine hash değerleri kullanın: her satır içi betik için 'sha256-...' değerleri. Betikteki herhangi bir değişiklik, bir boşluk bile, hash değerini değiştirir.
script-src içinde 'unsafe-inline' ve 'unsafe-eval' kullanmaktan kaçının. Bunlar, CSP’nin kapatmak için var olduğu kapıyı yeniden açar.
Bir şeyleri bozmadan devreye almak için politikayı önce Content-Security-Policy-Report-Only olarak gönderin. Tarayıcılar hiçbir şeyi engellemeden ihlalleri raporlar. Raporların gösterdiği sorunları düzeltin, sonra politikayı uygulamaya alın.
Trusted Types
Trusted Types, kendi JavaScript kodunuzun saldırganın kontrolündeki dizeleri innerHTML, eval() ya da bir script öğesinin src özelliği gibi tehlikeli API’lere aktardığı DOM tabanlı XSS’i hedef alır. Bu özelliği CSP ile açarsınız:
Content-Security-Policy: require-trusted-types-for 'script'; trusted-types app-policy
Uygulama açıkken bu hedeflerden birine düz bir dize aktarmak hata fırlatır. Kodun, genellikle HTML’i temizleyen, adı belirlenmiş bir politikanın oluşturduğu değerleri aktarması gerekir. MDN, bu API’yi Şubat 2026’dan beri Baseline olarak listeler; yani API büyük tarayıcıların güncel sürümlerinde çalışır. Mevcut kod dizeleri doğrudan DOM’a yazıyor olabileceğinden yalnızca raporlama moduyla başlayın.
Strict-Transport-Security ve preload
HSTS, tarayıcılara alan adınıza max-age değerindeki saniye sayısı boyunca yalnızca HTTPS üzerinden bağlanmalarını söyler. includeSubDomains ile kural her alt alan adını da kapsar.
Ön yükleme (preload) listesi bir adım daha ileri gider. Liste tarayıcılara yerleşik olarak gelir; böylece alan adınıza yapılan ilk ziyaret bile HTTPS kullanır. hstspreload.org’daki şartlar şunlardır:
- geçerli bir sertifika ve aynı ana bilgisayarda HTTP’den HTTPS’ye yönlendirme
- iç alt alan adları dahil her alt alan adının HTTPS üzerinden sunulması
- en az 31536000 (bir yıl) değerinde
max-age, ayrıcaincludeSubDomainsvepreload - HTTPS sitesinden yapılan yönlendirmelerde de HSTS başlığının gönderilmesi
Geçişi aşama aşama yapın. Preload sitesi max-age=300 ile başlamayı, ardından bir haftaya (604800), sonra bir aya (2592000) çıkmayı ve her adımda bir şeyin bozulup bozulmadığını izlemeyi önerir. Ön yükleme listesinden çıkarılma işleminin kullanıcılara ulaşması aylar sürer; bu yüzden her alt alan adının uzun vadede HTTPS’i destekleyebileceğinden emin olun.
X-Content-Type-Options
X-Content-Type-Options: nosniff, tarayıcıların bir dosyanın türünü içeriğinden tahmin etmesini engeller. Bunu her yanıtta doğru bir Content-Type ile, HTML için text/html; charset=UTF-8 gibi bir charset değeri de belirterek kullanın.
frame-ancestors ve X-Frame-Options
Clickjacking, sayfanızı başka bir sitede görünmez bir çerçeve içinde yükleyerek çalışır. CSP’nin frame-ancestors yönergesi sayfanızı kimin çerçeveleyebileceğini denetler; OWASP, bu yönergenin destekleyen tarayıcılarda X-Frame-Options’ın yerini aldığını belirtir.
İki ayrıntı sık gözden kaçar. MDN’e göre frame-ancestors, default-src değerine geri dönmez; bu yüzden açıkça tanımlanmalıdır. Ayrıca bir <meta> etiketinde hiçbir etkisi yoktur; yalnızca başlık olarak çalışır. Eski tarayıcılar için ikisini birden göndermenin bir zararı yoktur:
Content-Security-Policy: frame-ancestors 'none'
X-Frame-Options: DENY
Kendi siteniz kendi sayfalarını çerçeve içinde gösteriyorsa frame-ancestors 'self' kullanın. Artık kullanılmayan X-Frame-Options: ALLOW-FROM değerinden kaçının. MDN’in belirttiğine göre modern tarayıcılar bu değeri gördüklerinde başlığın tamamını yok sayar.
Referrer-Policy
Bu başlık, geçerli URL’nin ne kadarının Referer başlığında diğer sitelere gönderileceğini denetler. Hiçbir şey ayarlamazsanız tarayıcılar varsayılan olarak strict-origin-when-cross-origin kullanır; bu ayar HTTPS üzerinden diğer sitelere yalnızca kaynağı (origin) gönderir. OWASP yine de başlığın açıkça ayarlanmasını önerir. URL’leriniz token ya da kişisel veri içerebiliyorsa no-referrer ya da same-origin kullanın.
Permissions-Policy
Permissions-Policy, sitenizin kullanmadığı tarayıcı özelliklerini kapatır. Boş bir izin listesi, yani (), bir özelliği sayfanız ve içindeki her çerçeve için devre dışı bırakır:
Permissions-Policy: geolocation=(), camera=(), microphone=(), payment=()
Bir özelliğe ihtiyaç varsa, örneğin camera=(self) gibi dar bir izin verin.
COOP ve CORP
Cross-Origin-Opener-Policy: same-origin, sayfanızı kendi tarama bağlamı grubuna yerleştirir. Böylece sayfanızı window.open() ile açan bir sayfa ona referans tutamaz; bu da siteler arası sızıntı saldırıları (XS-Leaks) sınıfını kapatır. Tek oturum açma (SSO) ya da ödemeler için açılır pencerelere ihtiyaç duyuyorsanız same-origin-allow-popups bunların çalışmaya devam etmesini sağlar.
Cross-Origin-Resource-Policy: same-site, diğer sitelerin görseller ya da betikler gibi kaynaklarınızı gömmesini engeller. Cross-Origin-Embedder-Policy: require-corp yalnızca, SharedArrayBuffer gibi özelliklerin gerektirdiği cross-origin isolation (kaynaklar arası yalıtım) için gereklidir. Buna izin vermeyen farklı kaynaklı kaynakları engellediği için, bu özelliklere ihtiyacınız yoksa COEP kullanmayın.
Emekliye ayrılması gereken başlıklar
| Başlık | Durum | Ne yapmalı |
|---|---|---|
X-XSS-Protection | Kullanımdan kaldırıldı ve standart dışı; MDN, aksi hâlde güvenli olan sitelerde XSS açıklarına yol açabileceği konusunda uyarır | Kaldırın ya da 0 gönderin ve CSP’ye güvenin |
Expect-CT | Kullanımdan kaldırıldı | Kaldırın |
Public-Key-Pins | 2018’de Chromium’dan çıkarıldı | Kaldırın; bunun yerine Certificate Transparency ve CAA kayıtlarını kullanın |
X-Frame-Options: ALLOW-FROM | Artık kullanılmıyor | frame-ancestors kullanın |
Server, X-Powered-By | Yazılımı ve sürümleri açığa çıkarır | Kaldırın ya da nötr bir değer kullanın |
Nereden başlamalı
- Sitenizin bugün hangi başlıkları gönderdiğini güvenlik başlıkları taramamızla kontrol edin.
- Önce düşük riskli başlıkları ekleyin:
X-Content-Type-Options,Referrer-Policy,Permissions-Policyveframe-ancestors. - HSTS’i kısa bir
max-ageile devreye alın ve değeri aşama aşama artırın. Preload’u ancak her alt alan adı hazır olduğunda düşünün. - CSP’yi birkaç hafta yalnızca raporlama modunda çalıştırın, ihlalleri düzeltin, sonra uygulamaya alın.
Yeni bir uygulama geliştiriyor ve bu önlemlerin en baştan tasarıma dahil edilmesini istiyorsanız güvenli yazılım geliştirme ekibimiz yardımcı olabilir.
