HTTP Başlıkları Kontrolü rehberi
XGM HTTP Başlıkları Kontrolü'nün HSTS, CSP, X-Frame-Options ve Referrer-Policy için ne raporladığı; nginx ve diğer sunucular için hazır düzeltmelerle.
Güvenlik başlıkları ne işe yarar
Her HTTP yanıtı, tarayıcının sayfayı işlemeye başlamadan önce okuduğu başlıklar taşır. Bunların bir avuç kadarı, tarayıcının eski siteleri bozmadan varsayılan olarak uygulayamayacağı korumaları açar: yalnızca HTTPS üzerinden erişim, betik kaynaklarına getirilen kısıtlamalar, başka bir sitenin sayfayı çerçeve içine almasına karşı koruma. Bu başlıkları göndermenin maliyeti neredeyse sıfırdır ve karşılığında bütün bir saldırı sınıfı kapanır. Hiçbiri uygulamanızın kodunda değişiklik gerektirmez; çoğu, web sunucusunun yapılandırmasına eklenen tek bir satırdır. Bu yüzden güvenlik başlıkları, harcanan emek başına en çok kazanç sağlayan önlemler arasında sayılır.
Başlıklar yanıt başınadır. Bir sunucu bloğunda ya da uygulama rotasında ayarlanan bir başlık diğerlerine kendiliğinden geçmez; üstelik proxy'ler ve CDN'ler başlık ekleyebilir, değiştirebilir veya tamamen kaldırabilir. Bu nedenle gerçek yanıtı dışarıdan kontrol etmek, yapılandırma dosyalarını okumaktan daha güvenilirdir. Aynı sitenin farklı bölümleri farklı katmanlardan sunulduğunda sonuç çoğu zaman şaşırtıcı olur: anasayfa eksiksiz başlıklarla gelirken statik dosyalar ya da hata sayfaları çıplak kalır. Bu yüzden tek bir adresi değil, sitenin birkaç temsil edici adresini kontrol etmekte fayda vardır.
HTTP Başlıkları Kontrolü nasıl kullanılır
- HTTP Başlıkları Kontrolü aracını açın ve bir alan adı girin, örneğin
example.com. Şemayı yazmanız gerekmez. - XGM
https://example.comadresine istek gönderir, yönlendirmeleri izler ve son sayfanın başlıklarını okur. - Genel değerlendirmeyi ve her başlık için verilen bulguyu, CSP çözümlemesini (güvensiz kaynaklar, eksik direktifler, raporlama) ve önbellek başlıklarını gözden geçirin. Eksik ya da zayıf başlıkların yanında nginx, Apache, Caddy ve Cloudflare için kopyalayabileceğiniz birer kod parçası bulunur.
- Önbellekleme ve sunucu başlıkları da dâhil ham listeyi görmek için "Tüm yanıt başlıkları" bölümünü açın.
- Yapılandırmanızı değiştirdikten sonra kontrolü yeniden çalıştırın; kalıcı bağlantı alan adını URL'de tutar. Tam rapor sekmesi, önerilerle birlikte puanlanmış bir başlık raporu ekler.
Başlıklar son sayfadan alındığı için example.com adresinden www.example.com adresine bir yönlendirme varsa gördüğünüz başlıklar www adresine aittir. Çıplak alan adının yönlendirme yanıtlarını Yönlendirme Kontrolü ile ayrıca inceleyin; bu özellikle yönlendirmelerde de gönderilmesi gereken HSTS için önemlidir. Yönlendirme yanıtının kendisi de bir yanıttır ve kendi başlıklarını taşır. Tarayıcı HSTS'i gördüğü ilk yanıttan öğrenir, dolayısıyla onu yalnızca son sayfaya koymak korumayı bir adım geciktirir.
Başlıklar ve kontrol aracının beklentileri
| Başlık | Ne zaman geçer | Neden önemli |
|---|---|---|
Strict-Transport-Security | En az 15552000 (180 gün) değerinde bir max-age ile mevcut | Tarayıcılar yalnızca HTTPS kullanır; ilk ziyaretteki HTTP boşluğu kapanır |
Content-Security-Policy | script-src içinde 'unsafe-inline' veya 'unsafe-eval', joker karakter ya da eksik object-src olmadan mevcut | Enjekte edilen betiklere karşı tarayıcıdaki başlıca savunma |
X-Content-Type-Options | nosniff | Tarayıcıların içerik türünü tahmin etmesini durdurur |
X-Frame-Options | Mevcut (DENY veya SAMEORIGIN) | Clickjacking'i önler; modern karşılığı CSP içindeki frame-ancestors |
Referrer-Policy | Mevcut ve unsafe-url değil | URL'lerinizin ne kadarının başka sitelere gönderileceğini sınırlar |
Permissions-Policy | Mevcut (isteğe bağlı; eksikliği bilgilendirmedir) | Kamera veya konum gibi tarayıcı özelliklerini devre dışı bırakır |
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Content-Security-Policy "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;CSP'yi önce yalnızca rapor modunda başlatın
Content-Security-Policy-Report-Only ile yayına alın.Sürüm sızıntıları ve çerez bayrakları
Server: nginx/1.18.0 ya da X-Powered-By: PHP/7.4.3 gibi başlıklar, hangi yazılım sürümlerini çalıştırdığınızı herkese söyler. Bu tek başına bir güvenlik açığı yaratmaz, ama bir sürümün bilinen sorunları olduğunda saldırganın zamanını kısaltır. Kontrol aracı Server, X-Powered-By ve ASP.NET sürüm başlıklarındaki sürüm numaralarını bilgilendirme niteliğinde bulgular olarak raporlar. Sürüm numarasını gizlemek yama geçmenin yerini tutmaz; asıl iş yine güncel kalmaktır. Yine de otomatik tarayıcıların ilgisini üzerinize çekmemek, gelen gürültüyü hissedilir biçimde azaltır.
# nginx
server_tokens off;
# PHP (php.ini)
expose_php = OffSayfanın ayarladığı çerezler üç bayrak açısından kontrol edilir. Secure çerezin düz HTTP üzerinden gönderilmesini engeller, HttpOnly onu JavaScript'ten gizler ki bu özellikle oturum çerezlerinde önemlidir, SameSite ise tarayıcının çerezi siteler arası isteklerde ne zaman göndereceğini sınırlar. Bu bayrakları taşımayan bir oturum çerezini çalmak ya da kötüye kullanmak belirgin biçimde kolaydır. Kontrol aracı yalnızca herkese açık sayfanın ayarladığı çerezleri görür; oturum açıldıktan sonra verilen çerezleri kendiniz incelemeniz gerekir. Tarayıcı geliştirici araçlarındaki çerez listesi bu iş için fazlasıyla yeterlidir.
Set-Cookie: session=4f9c2b…; Path=/; Secure; HttpOnly; SameSite=LaxSık yapılan hatalar
| Neden | Açıklama | Çözüm |
|---|---|---|
nginx add_header yönergesinin always olmadan kullanılması | Hata yanıtlarında başlıklar atlanır | always ekleyin |
add_header yönergesinin bir location bloğunda kullanılması | Sunucu bloğundan devralınan bütün başlıkların yerini alır | Başlıkları tekrarlayın veya bir include dosyası kullanın |
| CDN veya proxy'nin başlıkları ezmesi | Kenar katmanı kendi değerlerini koyar ya da başlıkları kaldırır | Başlıkları tek bir katmanda ayarlayın ve dışarıdan doğrulayın |
| Başlıkların yalnızca uygulamada ayarlanması | Web sunucusunun sunduğu statik dosyalarda ve hata sayfalarında başlık bulunmaz | Güvenlik başlıklarını web sunucusunda veya CDN'de ayarlayın |
| Farklı değerlere sahip yinelenen başlıklar | Tarayıcılar ilkini uygulayabilir ya da ikisini birleştirebilir | Yinelenenleri kaldırın |
X-XSS-Protection başlığı bazı eski kontrol listelerinde hâlâ önerilir. Modern tarayıcılar bu başlığın denetlediği özelliği kaldırdı, dolayısıyla başlığın artık bir faydası yok; yerini Content Security Policy aldı. Göndermeye devam etmek zararlı değildir ama yanıtı büyütmekten başka bir işe de yaramaz. Aynı şey Expect-CT için de geçerlidir: kullanımdan kaldırılmıştır ve yeni yapılandırmalara eklenmemelidir.
Başlıkları diğer sunucularda ve platformlarda ayarlamak
Bulgulardaki nginx kod parçaları diğer web sunucularına doğrudan çevrilir. Başlıkları bir kez, her yanıtı sunan katmanda ayarlayın; statik dosyaların ve hata sayfalarının da bunları alabilmesi için uygulama kodu yerine web sunucusunu ya da CDN'i tercih edin. Uygulamanın kendi ara katmanı yalnızca uygulamanın ürettiği yanıtlara dokunur, oysa korunması gereken yüzey bundan geniştir. Tek istisna, yalnızca belirli rotalara özel bir CSP gerektiren durumlardır.
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"example.com {
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
X-Frame-Options "SAMEORIGIN"
Referrer-Policy "strict-origin-when-cross-origin"
-Server
}
}CDN'ler ve barındırma platformları yanıt başlığı eklemek için genellikle panellerinde bir kurallar ya da başlıklar bölümü veya depoda bir yapılandırma dosyası sunar. Bunları değiştirdikten sonra, platform başlıkları içerikle birlikte önbelleğe alıyorsa önbellekteki yanıtları temizleyin ve ardından dışarıdan yeniden kontrol edin. Bazı platformlarda kural yalnızca HTML yanıtlarına uygulanır; varlık dosyalarını da ayrıca kontrol edin. Değişikliğin bütün kenar düğümlerine yayılması birkaç dakika sürebilir, bu yüzden ilk kontrolde eski değerleri görmeniz olağandır.
Hangi başlığın hangi katmana ait olduğunu kısa bir notta tutun. Bir site yeni bir platforma taşındığında güvenlik başlıkları, kaybolduklarında gözle görülür hiçbir şey bozulmadığı için en sık yitirilen ayarlar arasındadır. Her taşımadan sonra kontrol aracını çalıştırmak bunu saniyeler içinde yakalar. Aynı notu bir sürüm yükseltmesinden ya da ters proxy değişikliğinden sonra da kullanabilirsiniz. Bu küçük alışkanlık, yıllar içinde sessizce eriyen bir yapılandırmayı önlemenin en ucuz yoludur.
Bakmaya değer diğer başlıklar
Ham başlık listesi önbellekleme ve başarım ayarlarını da gösterir. Cache-Control tarayıcıların ve CDN'lerin bir yanıtı ne kadar süre saklayacağına karar verir; kişisel veri içeren sayfalar private ya da no-store kullanmalıdır. Sıkıştırma Content-Encoding: gzip veya br olarak görünür, Vary ise hangi istek başlıklarının yanıtı değiştirdiğini açıklar. Yanlış ayarlanmış bir Vary, paylaşımlı önbelleklerin bir kullanıcının yanıtını bir başkasına vermesine yol açabilir. Bu yüzden önbellek başlıkları da en az güvenlik başlıkları kadar dikkatle okunmayı hak eder.
Kaynaklar arası yalıtım başlıkları (Cross-Origin-Opener-Policy, Cross-Origin-Embedder-Policy ve Cross-Origin-Resource-Policy) güçlü tarayıcı özelliklerine ihtiyaç duyan ya da diğer sitelerden katı biçimde yalıtılmak isteyen uygulamalar için önemlidir. Çoğu web sitesi için zorunlu değildir, bu yüzden kontrol aracı bunları notlandırmadan yalnızca listeler. SharedArrayBuffer gibi özellikleri kullanıyorsanız ilk ikisi zaten gereklidir. Aksi durumda bu başlıkları eklemek, üçüncü taraf gömme içeriğe dayanmayan siteler için güvenli bir sıkılaştırmadır.
SSS
Hangi güvenlik başlıkları en önemlidir?
En büyük korumayı Strict-Transport-Security ve Content-Security-Policy sağlar. X-Content-Type-Options ve çerçeveleme koruması kolay eklemelerdir; Referrer-Policy ile Permissions-Policy ise gizlilik ve tarayıcı özellikleri tarafını toparlar.
Kontrol aracı neden başka bir URL'nin başlıklarını gösteriyor?
Yönlendirmeleri izler ve son sayfayı raporlar. example.com adresi www.example.com adresine yönlendiriyorsa başlıklar www adresinden gelir.
Güvenlik başlıklarını HTML meta etiketleriyle ayarlayabilir miyim?
Yalnızca bazılarını. CSP kısmen bir meta etiketiyle ayarlanabilir, ancak HSTS, X-Frame-Options ve frame-ancestors mutlaka HTTP başlığı olmalıdır.
CSP frame-ancestors varken X-Frame-Options hâlâ gerekli mi?
Modern tarayıcılar ikisi birlikte gönderildiğinde frame-ancestors değerini kullanır. X-Frame-Options'ı da göndermek zararsızdır ve eski tarayıcıları kapsar.
Kusursuz bir başlık puanı siteyi güvenli yapar mı?
Hayır. Başlıklar belirli saldırıların tarayıcıdaki etkisini azaltır. Uygulama güvenliği, yama yönetimi ve erişim denetimi yine de gereklidir.
Başlıkların her sayfada bulunması gerekir mi?
Evet. Tarayıcılar onları yanıt başına uygular ve HSTS her yanıtta tazelenir. Hata sayfaları dâhil her sayfaya ulaşmaları için başlıkları sunucuda veya CDN'de ayarlayın.
CSP'im neden zayıf sayılıyor?
Kontrol aracı betik kaynaklarındaki 'unsafe-inline' ya da 'unsafe-eval' değerlerini, joker karakterli kaynakları, eksik bir default-src veya script-src direktifini ve eksik object-src direktifini işaretler. Bunların her biri, CSP'nin vermesi gereken korumanın etrafından dolaşmaya bir yol açar.
Kontrol aracı oturum açma arkasındaki sayfaları test edebilir mi?
Hayır. Herkese açık URL'ye çerez göndermeden istek yapar. Başlıklar sunucuda ayarlanmışsa oturum açılmış sayfalardaki başlıklar genellikle herkese açık olanlarla aynıdır.