Güvenlik header'ları: HSTS, CSP, X-Frame-Options ve diğerleri
· 7 dk okuma
Kısaca: Security HTTP header'ları, sunucunun her HTTP yanıta ekleyerek tarayıcıya sitenizi nasıl ele alacağını söylediği satırlardır. Doğru ayarlandığında tüm saldırı sınıflarını (XSS, clickjacking, MITM) ortadan kaldırır - ve ücretsizdir.
Kısaca: Security HTTP header'ları, sunucunun her HTTP yanıta ekleyerek tarayıcıya sitenizi nasıl ele alacağını söylediği satırlardır. Doğru ayarlandığında tüm saldırı sınıflarını (XSS, clickjacking, MITM) ortadan kaldırır - ve ücretsizdir.
Neden önemliler
Bir uygulama backend tarafında mükemmel güvenli olabilir ama doğru header'lar olmadan hâlâ browser tarafı saldırılara karşı savunmasızdır: cross-site scripting (XSS), clickjacking, protocol downgrade, MIME confusion. Güvenlik header'ları savunmayı tarayıcıya iter.
Strict-Transport-Security (HSTS)
Gelecekteki tüm ziyaretler için HTTPS'i zorlar. İlk HTTPS ziyaretinden sonra tarayıcı domain'i hatırlar ve kullanıcı kötü bir yanıta tıklasa bile herhangi bir http:// linkini kendisi https://'ye yeniden yazar.
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 (dikkat: HTTP-only subdomain'iniz varsa, onu kırar)preload= Chrome / Firefox / Safari'de yerleşik HSTS preload listesine dahil edilmeye izin verir
Dikkat:
preload ile HSTS, listeden 6+ ay sürede kaldırılır. HTTPS'in tüm subdomain'ler için de stabil çalıştığını doğrulamadan preload eklemeyin.
Content-Security-Policy (CSP)
En güçlü ama aynı zamanda yapılandırması en zor header. Tarayıcının nereden script, stil, resim, iframe yükleyebileceğini whitelist'ler. CSP olmadan <script> tag inject edebilen bir saldırgan keyfi JS çalıştırabilir - CSP ile yalnızca onaylanmış kaynaklardan kod.
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 kaynak 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 embed edemez (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)
X-Frame-Options
frame-ancestors'a daha eski alternatif. Clickjacking'i önler - saldırgan sayfanızı iframe olarak yerleştirir ve görünmez butonlarla kaplar.
X-Frame-Options: DENY
Değerler: DENY (hiç kimse), SAMEORIGIN (sadece kendi domain'im), ALLOW-FROM uri (deprecated).
X-Content-Type-Options
X-Content-Type-Options: nosniff
MIME sniffing'i devre dışı bırakır - tarayıcı sunucunun döndüğü Content-Type'a saygı duyacaktır. Bu olmadan saldırgan yanlış tipli bir dosya yükleyebilir (örn. aslında script'li HTML olan bir resim) ve tarayıcı bunu web page olarak çalıştırabilir.
Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
Tarayıcının tıklamada Referer header'ında önceki sayfa hakkında ne kadar bilgi gönderdiğini kontrol eder. Modern tarayıcılarda varsayılan zaten strict-origin-when-cross-origin, ancak açık deklaratif header tutarlılığı sağlar.
Permissions-Policy
İhtiyacınız olmayan API'leri kapatır - kamera, mikrofon, GPS, geolocation. Bir saldırgan XSS üzerinden bu API'leri talep edemez.
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
nginx'de pratik yapılandırma
server {
listen 443 ssl http2;
server_name example.com;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
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 audit'i
En kolay online araç ile. Bizim header check'imiz hangi header'ların eksik olduğunu ve hangilerinin yanlış olduğunu gösterir. Kapsamlı audit için securityheaders.com da A-F puanı verir.
Sonuç
Güvenlik header'ları, güvenlik alanında çaba-kazanç oranına göre en iyi yatırımlardan biridir - tipik olarak bir bütün browser tarafı saldırı kategorisine karşı reverse proxy'de yarım saatlik kurulum. Düzenli bakım çerçevesinde yarım yılda bir audit makul minimumdur.
Ücretsiz security headers audit
Kayıt olmadan, üç saniyede sonuç.
ePulz.io'yu ücretsiz deneyin - 7 gün, kredi kartı gerekmez.
Hesap oluştur