Ücretsiz · hesap gerekmez

Güvenlik başlıkları kontrolü

Herkese açık bir web sitesinin HTTP güvenlik başlıklarını online kontrol et. Bir alan adı gir; sekiz temel güvenlik başlığının son yanıtta nasıl değerlendirildiğini ve gösterilebildiği yerde gözlenen değeri gör.

Web sitenizin herkese açık ayarları ücretsiz kontrol edilir. Sitenizde değişiklik yapılmaz.

Kayıt gerekmez Zarar verici trafik yok Herkese açık web sitesi kontrolleri
Başlık başvurusu

Her başlık ne yapar ve nasıl değerlendirilir

Bu kontrol, bu başlıkları tek bir yanıtta okur. Satırların çoğu varlık kontrolüdür: gönderilen başlık sayılır ve değeri mümkün olduğunda gösterilir; böylece sitene uyup uymadığına sen karar verebilirsin.

BaşlıkNe yaparİyi bir ayarBu kontrol nasıl değerlendirir
Strict-Transport-SecurityGeri dönen tarayıcıların, düz HTTP ile herhangi bir istek göndermeden önce kendiliğinden HTTPS’e geçmesini sağlar.Geçiş aşamaları bittikten sonra uzun bir max-age (180 gün veya daha fazla); aşamalar rehberde anlatılır.HTTPS hedefte yoksa: orta. http:// adresi girdiğinde değerlendirilmez.
Content-Security-PolicyTarayıcıya, sayfanın kodu ve içeriği için izin verilen kaynakların listesini verir.Sayfalarının gerçekten kullandığı kaynaklardan oluşturulmuş, geniş script istisnaları içermeyen bir politika.Yoksa: orta. Değer gösterilir ama incelenmez.
X-Frame-Options · frame-ancestorsBaşka sitelerin sayfanı kendi çerçevelerinin içinde göstermesini engeller.CSP içinde frame-ancestors; eski tarayıcılar için yedek olarak X-Frame-Options.İkisi de yoksa: orta.
X-Content-Type-OptionsTarayıcının her yanıtın bildirilen içerik türüne güvenmesini sağlar.Tek değer olarak nosniff.Yoksa veya başka bir değer varsa: düşük.
Referrer-PolicyZiyaretçiler bağlantılarını izlediğinde diğer sitelerin sayfa adresinin hangi kısmını göreceğini sınırlar.En az güncel tarayıcı varsayılanı kadar sıkı bir politika.Yoksa: düşük.
Access-Control-Allow-OriginHangi diğer sitelerin script’lerinin yanıtlarını okuyabileceğine karar verir.Sıradan sayfalarda gönderilmez ya da tek bir güvenilir origin’i belirtir.Wildcard (*): orta.
Server · X-Powered-ByYanıtın arkasındaki yazılımı duyurur.Kaldırılmış veya genel bir değere indirilmiş.Herhangi bir Server veya X-Powered-By başlığı: sürüm numarası olmasa bile düşük. Yalnızca tanınan teknoloji adları gösterilir.
Set-CookieCookie ayarlar; nitelikleri hangi script’lerin onları okuyabileceğini ve ne zaman gönderileceklerini belirler.Oturum cookie’leri script’lerden gizli ve yalnızca HTTPS üzerinden gönderilir.Bu yanıtta HttpOnly içermeyen veya HTTPS’te Secure içermeyen bir cookie: orta. SameSite kontrol edilmez ve cookie değerleri hiçbir zaman gösterilmez.

Permissions-Policy ve Cross-Origin-Opener-Policy bu sayfada değerlendirilmez. Yayına hazırlık snapshot’ı onları yalnızca ayrı sertleştirme notunda sayar.

Nasıl düzeltilir

Bu başlıkları sunucuna nasıl eklersin

Her başlığı tüm isteklere yanıt veren tek bir katmanda ayarla: web sunucusu, CDN veya barındırma platformu. Aşağıdaki değerlerle başla, ardından önemli sayfalarını test ederken değerleri aşama aşama sıkılaştır.

Güvenli başlangıç değerleri

  1. 01Strict-Transport-Security: max-age=300Yalnızca HTTPS yanıtlarında gönder; tarayıcılar düz HTTP üzerinden gelen başlığı yok sayar. max-age değerini adım adım artır, örneğin önce bir haftaya, sonra bir aya ve ardından bir yıla (31536000), her adımda siteni kontrol et. includeSubDomains’i yalnızca her alt alan adı HTTPS sunuyorsa ekle; preload’u ise hstspreload.org gereksinimlerini okuduktan sonra ekle, çünkü preload listesinden çıkmak aylar sürer.
  2. 02Content-Security-Policy-Report-Only: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'Report-Only hiçbir şeyi engellemez: tarayıcı, politikanın neyi engelleyeceğini konsolda veya bir raporlama uç noktası eklersen oraya bildirir. Önemli sayfalarını aç, gerçekten kullandıkları kaynakları ekle, sonra aynı politikayı Content-Security-Policy olarak gönder. Script’ler için 'unsafe-inline' kullanma; nonce veya hash daha sıkı seçenektir.
  3. 03frame-ancestors 'self' · X-Frame-Options: SAMEORIGINUygulanan bir Content-Security-Policy içindeki frame-ancestors, sayfalarını hangi sitelerin çerçeveleyebileceğine karar verir. X-Frame-Options eski tarayıcıları kapsar ve CSP’n hâlâ Report-Only iken engellemeyi o yapar. Sayfaların hiç çerçevelenmiyorsa 'none' ve DENY kullan, iki değeri birlikte güncelle ve frame-ancestors’ı başlık olarak gönder, çünkü tarayıcılar onu meta etiketinde yok sayar.
  4. 04X-Content-Type-Options: nosniffHer yanıtta tek değer olarak nosniff gönder. Tarayıcılar bundan sonra yanlış Content-Type ile sunulan script ve stil dosyalarını reddeder; bu yüzden önce sunucunun JavaScript ve CSS dosyalarını doğru etiketlediğini kontrol et.
  5. 05Referrer-Policy: strict-origin-when-cross-originDiğer siteler tam sayfa adresini değil, yalnızca origin’ini alır; bir bağlantı HTTPS’ten HTTP’ye gidiyorsa hiçbir şey almaz. Güncel tarayıcılar bunu zaten varsayılan olarak kullanır; başlığı göndermek davranışı her yerde aynı tutar. URL’lerin özel veri taşıyorsa same-origin veya no-referrer seç.
  6. 06Permissions-Policy: camera=(), microphone=(), geolocation=()Boş liste () bir özelliği sayfan ve sayfanın gömdüğü her çerçeve için kapatır. Yalnızca sitenin hiç kullanmadığı özellikleri listele, ardından harita, görüntülü görüşme veya ödeme bileşeni içeren sayfaları test et.

Platforma göre kopyalanmaya hazır örnekler

Her örnek aynı başlangıç değerlerini ayarlar. Barındırma platformları Strict-Transport-Security’yi zaten gönderiyor olabilir; bu yüzden Vercel, Netlify ve Next.js örneklerinde bu başlık yer almaz. Canlı yanıtı kontrol et ve yalnızca eksikse ekle.

nginx

Satırları HTTPS sunan server bloğuna koy. always parametresi başlıkları hata yanıtlarına da ekler. Kendi add_header satırları olan bir location bloğu, server bloğundan devralınacak tüm add_header satırlarını düşürür; bu yüzden seti orada tekrarla veya tek bir include dosyasında tut.

# In the server block that serves HTTPS (listen 443 ssl)
add_header Strict-Transport-Security "max-age=300" always;
add_header Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

Apache

mod_headers’ı etkinleştir ve satırları 443 portunun virtual host’una ya da AllowOverride FileInfo ayarlı olduğu yerde .htaccess dosyasına ekle. Header always set hata yanıtlarını ve yönlendirmeleri de kapsar.

# <VirtualHost *:443> or .htaccess; needs mod_headers (Debian/Ubuntu: a2enmod headers)
Header always set Strict-Transport-Security "max-age=300"
Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"

Cloudflare

Panelde ana makine adın için bir Response Header Transform Rule oluştur ve her başlığı Set static işlemiyle ekle; bu işlem origin’inden gelen aynı adlı başlığın yerine geçer. HSTS’in SSL/TLS, Edge Certificates altında kendi ayarı vardır; ya onu ya kuralı kullan, ikisini birden değil. Menü adları panel sürümüne göre değişebilir.

Rule type   Response Header Transform Rule
When        Hostname equals example.com
Then        Set static, one row per header:
  X-Content-Type-Options               nosniff
  Referrer-Policy                      strict-origin-when-cross-origin
  X-Frame-Options                      SAMEORIGIN
  Permissions-Policy                   camera=(), microphone=(), geolocation=()
  Content-Security-Policy-Report-Only  default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'

HSTS        SSL/TLS > Edge Certificates > HTTP Strict Transport Security (HSTS)

Vercel

Proje kök dizinindeki vercel.json dosyasına bir headers girdisi ekle. /(.*) kaynak deseni her yolla eşleşir; bazı rotalar farklı bir politika gerektiriyorsa deseni daralt.

{
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        { "key": "Content-Security-Policy-Report-Only", "value": "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" },
        { "key": "X-Frame-Options", "value": "SAMEORIGIN" },
        { "key": "X-Content-Type-Options", "value": "nosniff" },
        { "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" },
        { "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=()" }
      ]
    }
  ]
}

Netlify

Yayın dizininde, yani Netlify’ın dağıttığı klasörde, _headers adlı bir dosya oluştur. /* gibi her yol satırını girintili Ad: değer satırları izler. Aynı kurallar netlify.toml içinde [[headers]] altında da yer alabilir.

/*
  Content-Security-Policy-Report-Only: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'
  X-Frame-Options: SAMEORIGIN
  X-Content-Type-Options: nosniff
  Referrer-Policy: strict-origin-when-cross-origin
  Permissions-Policy: camera=(), microphone=(), geolocation=()

Next.js

Başlıkları next.config.js içindeki async headers() fonksiyonundan döndür; '/:path*' kaynağı her rotayı kapsar. headers() statik dışa aktarımda (output: 'export') çalışmaz; bu durumda başlıkları dışa aktarılan dosyaları sunan barındırmada ayarla.

// next.config.js
const securityHeaders = [
  { key: 'Content-Security-Policy-Report-Only', value: "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" },
  { key: 'X-Frame-Options', value: 'SAMEORIGIN' },
  { key: 'X-Content-Type-Options', value: 'nosniff' },
  { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
  { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
];

module.exports = {
  async headers() {
    return [{ source: '/:path*', headers: securityHeaders }];
  },
};

Yayına aldıktan sonra kontrolü yeniden çalıştır: son yanıtı okuduğu için CDN’inin veya platformunun gerçekte ne gönderdiğini gösterir. Ardından tarayıcının geliştirici araçlarında bir hata sayfası ve bir statik dosya aç, çünkü başlıklar çoğu zaman yalnızca bazı yanıtlar için ayarlanır.

Sonucu okumak

Her durum nasıl okunur.

  1. 01GeçtiBaşlık bulundu ve varlık kontrolünü karşılıyor.
  2. 02Düşük · Orta · YüksekBir şey eksik ya da bu kontrolün işaretlediği bir şekilde ayarlanmış. Seviye, tam snapshot’ın kullandığıyla aynıdır.
  3. 03GözlendiBir değer kaydedildi, ancak kontrol ne geçti ne de bulgu üretti.
  4. 04GözlenmediKontrol çalıştı ama kaydedilecek bir şey yoktu; örneğin yanıtta cookie yoktu.
  5. 05UygulanmazKontrol uygulanmaz; örneğin http:// adresi girdiğinde HSTS.
  6. 06ÖlçülmediKullanılabilir bir yanıt alınamadı, bu yüzden kontrol geçti sayılmaz.
Kapsam

Bu kontrolün yapmadıkları.

  1. 01Yalnızca girdiğin origin’in ana sayfasını ister. Path ve query bilgisi atılır, başka sayfa istenmez.
  2. 02Çoğunlukla bir başlığın var olup olmadığını kontrol eder, değerinin sitene uyup uymadığını değil.
  3. 03HTTP’den HTTPS’e yönlendirmeyi yalnızca http:// adresini girdiğinde test eder; bu çalıştırma TLS’i atlar ve eksik HSTS başlığını raporlamaz.
  4. 04Bir zafiyet taraması veya pentest değildir ve saldırı trafiği göndermez.
  5. 05Sonuç, tek bir yanıtın anlık görüntüsüdür; bir CDN kuralı veya başka bir sayfa farklı başlıklar gönderebilir.
SSS

Başlık kontrolü hakkında sorular.

Server: nginx neden sürüm olmadan işaretleniyor?

Herhangi bir Server veya X-Powered-By başlığı düşük olarak değerlendirilir, çünkü ad tek başına ziyaretçilere sitede hangi yazılımın çalıştığını söyler. Platformun izin veriyorsa başlığı kaldır veya genel bir değere indir.

Sonuç neden sunucu yapılandırmamdan farklı?

Kontrol, en fazla beş yönlendirmeden sonra aldığı yanıtı okur. Bir CDN, proxy veya barındırma platformunun eklediği ya da kaldırdığı başlıklar geçerli olanlardır; CDN, proxy veya bot koruması kuralları tarayıcılara bu kontrolden farklı yanıt verebilir.

Sahibi olmadığım bir siteyi kontrol edebilir miyim?

Evet. Başlık kontrolü, sitenin zaten her ziyaretçiye gönderdiği sıradan bir yanıtı okur; tam çalıştırma diğer kontroller için birkaç sıradan istek daha gönderir. Korumalı modüller ve tam denetimler doğrulanmış hedef veya açık yetki gerektirir.

Bu bir zafiyet taraması mı?

Hayır. Yanıt başlıklarının pasif bir kontrolüdür; zafiyet taraması veya pentest değildir ve bir sitenin güvenli olduğunu kanıtlamaz.

Başlıklarım neden bazı yanıtlarda yok?

Başlıklar çoğu zaman yalnızca tek bir rota, dosya türü veya durum kodu için ayarlanır. nginx’te always olmadan add_header hata yanıtlarını atlar ve kendi add_header satırları olan bir location bloğu server bloğundakileri düşürür. Statik dosyalar, API rotaları ve başka bir servisin sunduğu sayfalar da başlıkları ayarlayan kuralın dışında kalabilir.

Aynı başlığı hem uygulamada hem CDN’de ayarlayabilir miyim?

Her başlığı tek bir katmanda ayarla. İki katman da eklerse tarayıcı iki değer alabilir: Content-Security-Policy’de gönderilen her politika uygulanır, yani sonuç ikisinden de sıkı olur; Strict-Transport-Security’de ise yalnızca ilk başlık kullanılır.

Alan adımı HSTS preload listesine göndermeli miyim?

Yalnızca bugünkü ve gelecekteki her alt alan adı HTTPS sunabiliyorsa. Liste includeSubDomains ve preload ile en az bir yıllık max-age ister; tarayıcılar sonra alan adın için ilk ziyaretten önce bile HTTPS kullanır ve listeden çıkışın kullanıcılara ulaşması aylar sürebilir. Preload olmadan uzun bir max-age de geri dönen ziyaretçileri kapsar.