Web sitende güvenlik başlıkları: CSP, HSTS ve diğerleri
HTTP güvenlik başlıkları, sunucunun tarayıcıya "bu siteyi nasıl korumalısın" diye verdiği talimatlardır. Kod değiştirmeden birçok saldırının etkisini azaltırlar. Sitenin başlıklarını tarayıcının geliştirici araçlarında, Ağ (Network) sekmesinde ilk isteğe tıklayarak görebilirsin.
Strict-Transport-Security (HSTS)
Strict-Transport-Security: max-age=31536000
Tarayıcıya "bu siteye bir yıl boyunca sadece HTTPS ile bağlan" der. HTTP'ye düşürme saldırılarını engeller.
Dikkat: includeSubDomains eklersen bütün alt alan adların HTTPS desteklemek zorunda kalır. HTTPS'i olmayan eski bir alt alan adın varsa erişilemez olur. Önce kısa bir max-age ile dene.
Content-Security-Policy (CSP)
En güçlü ama en dikkat isteyen başlık. Sayfada hangi kaynaklardan betik, stil, görsel ve çerçeve yüklenebileceğini belirler. Bir XSS açığı olsa bile saldırganın betiği çalışmaz.
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-RASTGELE'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'
- nonce: Her istekte yeni üretilen rastgele değer. Sadece bu değeri taşıyan satır içi
<script>çalışır. 'unsafe-inline'betiklerde kullanma: CSP'nin koruduğu şeyi büyük ölçüde iptal eder.onclick="..."gibi satır içi olay tanımları nonce ile çalışmaz. Bunları JavaScript dosyasınaaddEventListenerile taşı.- Önce
Content-Security-Policy-Report-Onlyile yayınla. Tarayıcı engellemez, sadece konsolda ihlalleri gösterir. Analiz, reklam, bot koruması gibi dış servislerin hangi adresleri kullandığını böyle görürsün.
Diğer başlıklar
| Başlık | Önerilen değer | Ne işe yarar |
|---|---|---|
X-Content-Type-Options |
nosniff |
Tarayıcının dosya türünü tahmin etmesini engeller |
X-Frame-Options |
SAMEORIGIN |
Siten başka sitelerde çerçeve içinde açılamaz (clickjacking) |
Referrer-Policy |
strict-origin-when-cross-origin |
Dış sitelere tam adres yerine sadece alan adı gider |
Permissions-Policy |
camera=(), microphone=(), geolocation=() |
Kullanmadığın tarayıcı özelliklerini kapatır |
CSP'de frame-ancestors tanımlıysa modern tarayıcılar onu X-Frame-Options yerine kullanır, ama eski tarayıcılar için ikisini birlikte göndermek zararsızdır.
Çerez bayrakları
Oturum çerezlerinde şu üçü olmalı:
Secure: Sadece HTTPS üzerinden gönderilir.HttpOnly: JavaScript okuyamaz.SameSite=Lax(veyaStrict): Başka sitelerden gelen isteklerde gönderilmez, CSRF riskini azaltır.
Nereye eklenir?
Web sunucusunda (Nginx'te add_header ... always;) ya da uygulamanın yanıt katmanında. CSP nonce'u her istekte değiştiği için uygulama tarafında üretmek gerekir. Ekledikten sonra sitenin her sayfa türünü (giriş, form, ödeme, yönetim paneli) tarayıcı konsolu açıkken gez ve hata olup olmadığına bak.