Bloga geri dön

Güvenlik header'ları: HSTS, CSP, X-Frame-Options ve diğerleri

· 7 dk okuma

Backend bir kaledir ama savunmanın ikinci yarısı tarayıcıdadır. HSTS, CSP ve diğer headerlar XSS, clickjacking ve MITM'i engeller - üstelik ücretsiz.

Güvenlik header'ları: HSTS, CSP, X-Frame-Options ve diğerleri

Neden önemliler

Bir uygulama backend tarafında kusursuz güvenli olsa bile, doğru header'lar olmadan tarayıcı tarafı saldırılara karşı savunmasız kalabilir: cross-site scripting (XSS), clickjacking, protocol downgrade, MIME confusion. Güvenlik header'ları savunmayı doğrudan tarayıcıya taşır.

Strict-Transport-Security (HSTS)

Gelecekteki tüm ziyaretler için HTTPS'i zorunlu kılar. İlk HTTPS ziyaretinden sonra tarayıcı domain'i hatırlar ve kullanıcı yanlış bir linke tıklasa bile her http:// linkini kendiliğinden https://'ye dönüştürür.

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
  • max-age=63072000 = 2 yıl geçerli
  • includeSubDomains = kural tüm subdomain'ler için de geçerlidir; HTTPS'i her yerde zorunlu kıldığından, yalnızca HTTP üzerinden çalışan bir subdomain, örn. staging.example.com, tarayıcıda erişilemez hale gelir
  • preload = Chrome / Firefox / Safari'de yerleşik HSTS preload listesine dahil edilmeye izin verir

Dikkat: preload içeren bir HSTS'in listeden kaldırılması 6+ ay sürer. HTTPS'in tüm subdomain'lerde stabil çalıştığını doğrulamadan preload eklemeyin.

Content-Security-Policy (CSP)

En güçlü, ancak aynı zamanda yapılandırması en zor header. Tarayıcının nereden script, stil, resim ve iframe yükleyebileceğini whitelist'ler. CSP olmadan, <script> tag inject edebilen bir saldırgan keyfi JS çalıştırabilir; CSP ile yalnızca onaylı kaynaklardan kod çalışır.

Content-Security-Policy: default-src 'self'; script-src 'self' 'sha256-...'; img-src 'self' data: https://cdn.example.com; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'

Yaygın direktifler:

  • default-src 'self' = varsayılan olarak yalnızca kendi domain'imden kaynaklara izin ver
  • script-src = JS kaynakları (inline script'ler için hash veya nonce belirtin)
  • style-src = CSS kaynakları
  • img-src = resimler
  • connect-src = AJAX, WebSocket, EventSource
  • frame-ancestors 'none' = hiç kimse sayfayı iframe'e gömemez (X-Frame-Options'tan daha iyi)
  • report-uri /csp-report = tarayıcı her ihlalde JSON gönderir (siz backend'de yakalar ve loglarsınız)
  • Not: report-uri bugün deprecated durumda - report-to destekleyen tarayıcılar onu yok sayar. Modern yöntem report-to direktifi artı ayrı bir Reporting-Endpoints başlığıdır; report-uri'yi yalnızca report-to'yu henüz desteklemeyen Firefox için fallback olarak bırakın.

X-Frame-Options

frame-ancestors'a daha eski bir alternatif. Saldırganın sayfanızı iframe olarak gömüp üzerine görünmez butonlar yerleştirdiği clickjacking'i önler.

X-Frame-Options: DENY

Değerler: DENY (hiç kimse), SAMEORIGIN (yalnızca kendi domain'im), ALLOW-FROM uri (deprecated).

X-Content-Type-Options

X-Content-Type-Options: nosniff

MIME sniffing'i devre dışı bırakır, böylece tarayıcı sunucunun döndürdüğü Content-Type'a uyar. Bu olmadan saldırgan yanlış tipte bir dosya yükleyebilir (örn. aslında script içeren HTML olan bir resim) ve tarayıcı bunu bir web sayfası olarak çalıştırabilir.

Referrer-Policy

Referrer-Policy: strict-origin-when-cross-origin

Tıklamada tarayıcının önceki sayfa hakkında Referer header'ında ne kadar bilgi gönderdiğini kontrol eder. Modern tarayıcılarda varsayılan zaten strict-origin-when-cross-origin, ancak header'ı açıkça ayarlamak tutarlı davranışı garanti eder.

Permissions-Policy

İhtiyacınız olmayan API'leri devre dışı bırakır: kamera, mikrofon, GPS ve geolocation. XSS'i kötüye kullanan bir saldırgan bu API'leri talep edemez.

Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()

nginx'te pratik yapılandırma

server {
  listen 443 ssl http2;
  server_name example.com;

  add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
  # preload'u burada bilerek atladık - ancak %100 emin olduğunda ekle (yukarıdaki preload tuzağına bak)
  add_header X-Content-Type-Options "nosniff" always;
  add_header X-Frame-Options "DENY" always;
  add_header Referrer-Policy "strict-origin-when-cross-origin" always;
  add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

  # CSP geniştir - uygulamanıza göre tanımlayın
  add_header Content-Security-Policy "default-src 'self'; script-src 'self'; ..." always;
}

Anahtar always'tir - bu olmadan nginx, hata yanıtlarında (4xx, 5xx) header'ları atlar.

Mevcut durumun auditi

En kolayı bir online araçtır. Header check'imiz hangi header'ların eksik, hangilerinin yanlış olduğunu gösterir. Kapsamlı bir audit için securityheaders.com ayrıca bir A-F puanı verir.

Sonuç

Güvenlik header'ları, çaba-kazanç oranı açısından güvenlikteki en iyi yatırımlardan biridir: tipik olarak, bütün bir tarayıcı tarafı saldırı kategorisine karşı reverse proxy'de yarım saatlik bir kurulum. Düzenli bakım kapsamında altı ayda bir yapılan audit makul bir asgaridir.

Ücretsiz security headers audit

Kayıt olmadan, üç saniyede sonuç.

Siteyi test et →

Paylaş: Bağlantı kopyalandı

ePulz.io'yu ücretsiz deneyin - 7 gün, kredi kartı gerekmez.

Hesap oluştur