Her HTTP yanıtının görünmeyen bir eki vardır: tarayıcının nasıl davranacağını söyleyen güvenlik başlıkları. Uygulama kodunuza dokunmadan, birkaç satır yapılandırma ile betik enjeksiyonunun büyük kısmını, protokol aşağı düşürmeyi ve çerez çalmayı zorlaştırırsınız. Ama bu başlıkların adları geçildiğinde çoğu toplantının atmosferi değişir; "CSP şöyleydi, HSTS böyleydi" cümleleri havada kalır. Bu yazı, havadaki o cümleleri yere indirmeye çalışır. Her başlığı iki cümlede tanımlayıp, devreye almanın en kısa yolunu vereceğiz. Her başlığı iki cümlede tanımlayıp, devreye almanın en kısa yolunu vereceğiz.

CSP: betiklerin pasaportu

Content-Security-Policy, tarayıcıya "bu sayfada hangi kaynaklar yüklenebilir" sorusunun cevabını verir. Amaç, sayfaya sızan bir betiğin bile çalışamamasıdır. Doğru kurulan bir CSP, satır içi betikleri engeller, yalnızca tanımlı alan adlarından yükleme izin verir. Pratikte en zor kısım burasıdır: eski uygulamalar satır içi betikle doludur, kısıtlar kaldırıldığında sayfa beyaz olur. Bu yüzden CSP, kademeli olarak devreye alınır: önce rapor modu, sonra kademeli kısıt.

Content-Security-Policy: default-src 'self'; script-src 'self' cdn.ornek.com;
  img-src 'self' data:; object-src 'none'; frame-ancestors 'none';
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(self)

HSTS ve arkadaşları

Strict-Transport-Security, tarayıcıya "bu alan adına bir yıl daha yalnızca HTTPS ile gel" der; kullanıcı ilk ziyaretten sonra elle http:// yazsa bile tarayıcı önce HTTPS'e yükseltir. includeSubDomains ile alt alan adları da kapsanır, preload ile liste servislerine eklenir. X-Content-Type-Options: nosniff, tarayıcının dosya türünü tahmin etmesini engeller; Referrer-Policy, dış sitelere giden bağlantılarda hangi bilginin sızacağını ayarlar; Permissions-Policy, kamera ve mikrofon gibi güçlü arayüzleri alan adı bazında kilitler. Beşi birden, tek bir yanıt başlığı bloğunda karşılanır. Hiçbiri tek başına bir saldırıyı durdurmaz; hepsi birlikte, saldırganın işini her adımda biraz daha pahalılaştırır. Ortak yanları da aynıdır: tek satırlık yapılandırma, satır aralarında onlarca saatlik istismar potansiyelini kapatır, kod tabanınızda hiçbir değişiklik istemez ve kullanıcının hiçbirini rahatsız etmez.

Raporlardan öğrenme

CSP'nin gerçek gücü, ihlal raporlarında ortaya çıkar. report-uri ya da report-to yönergesiyle, engellenen kaynakları toplayan bir uç nokta kurarsınız; birkaç hafta sonra hangi üçüncü parti betiğin sayfanıza girdiğini, hangi kampanya takibinin resim yüklediğini raporlardan görürsünüz. Bu veri olmadan CSP ayarı, karanlıkta iğne dikmektir. Raporlar aynı zamanda yönetimle konuşmanın en iyi dili: "geçen ay CSP bize otuz bir enjeksiyon denemesini engelledi" cümlesi, başlık ayarına ayrılan saatlerin karşılığıdır.

Başlıklar, tek seferlik bir ayar değil, canlı bir sözleşmedir. Yeni bir üçüncü parti servis eklendiğinde, yeni bir alt alan adı kurulduğunda bu sözleşme güncellenir. Sözlük burada bitsin; uygulama, kendi sitenizin yanıt başlıklarını bugün bir komutla görüntüleyerek başlar. Bir de altın kural: başlık eklerken önce rapor modunda bir hafta çalıştırın, tarayıcı konsolundaki ihlalleri okuyun, sonra kısıtı sıkılaştırın. Aceleye gelen başlık ayarı, sayfayı değil kullanıcıyı kırar; oysa doğru ayarlanmış başlıklar, yıllarca kimsenin aklına gelmeyen sessiz bir savunma hattı kurar. Tek saatlik ayar, on yıllık sessiz miras demektir.

curl -sI https://ornek-site.example | grep -iE "content-security|strict-transport|x-content|referrer|permissions"