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.
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çerliincludeSubDomains= 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 gelirpreload= 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 verscript-src= JS kaynakları (inline script'ler için hash veya nonce belirtin)style-src= CSS kaynaklarıimg-src= resimlerconnect-src= AJAX, WebSocket, EventSourceframe-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-uribugün deprecated durumda -report-todestekleyen tarayıcılar onu yok sayar. Modern yöntemreport-todirektifi artı ayrı birReporting-Endpointsbaşlığıdır;report-uri'yi yalnızcareport-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ç.
ePulz.io'yu ücretsiz deneyin - 7 gün, kredi kartı gerekmez.
Hesap oluştur