Modern web geliştirme ortamında, bir uygulamayı güvence altına almak, veritabanınızı korumak ve SQL enjeksiyonunu önlemenin ötesine geçer. Kritik, ancak genellikle göz ardı edilen bir savunma katmanı, sunucunuz tarafından gönderilen HTTP yanıt başlıklarında yatar. Bu başlıklar, tarayıcıya içeriğinizle güvenli şekilde etkileşime girmesi konusunda talimat verir. Doğru yapılandırılmadığında, mükemmel kodlanmış bir uygulama bile Çapraz Site Komut Dosyası (XSS), tıklama hırsızlığı (clickjacking) ve MIME türü koklama saldırılarına kurban gidebilir.
Bu rehber, her geliştiricinin uygulaması gereken temel güvenlik başlıklarını inceler ve altyapılarını güçlendirmek isteyen ara seviye ileri düzey mühendisler için pratik tavsiyeler sunar.
1. İçerik Güvenlik Politikası (CSP)
İçerik Güvenlik Politikası (CSP), bir geliştiricinin güvenlik silahlanmasında tartışmasız en güçlü araçtır. İzin verilen içerik kaynaklarını tanımlayarak, dinamik kaynakların yüklenmesine izin verilenleri belirleyerek XSS ve veri enjeksiyon saldırılarını etkili bir şekilde azaltır.
İyi yapılandırılmış bir CSP, script-src, style-src ve img-src gibi kaynak yönergelerini kısıtlar. Güvenlik açısından ideal olan 'none' politikası, genellikle modern uygulamalar için çok kısıtlayıcıdır. Bunun yerine, bir "beyaz liste" yaklaşımı hedeflemelisiniz.
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src *; connect-src 'self' https://api.example.com
Profesyonel İpucu: Başlangıçta, başlığınıza ; report-uri /csp-violation-report-endpoint ekleyerek yalnızca raporlama modunda başlayın. Bu, uygulamayı bozmadan üretim ortamındaki ihlalleri izlemenizi sağlar ve politikayı kesin olarak uygulamadan önce onu iyileştirmenize olanak tanır.
2. X-Frame-Options ve CSP Frame-Ancestors ile Tıklama Hırsızlığını Önleme
Tıklama hırsızlığı (clickjacking), bir saldırganın sitenizi kötü amaçlı bir sitenin içindeki bir iframe'e gömerek kullanıcıları gizli öğeleri tıklamaya ikna ettiği kötü amaçlı bir tekniktir. Buna karşı koymak için X-Frame-Options başlığını kullanmalısınız.
X-Frame-Options: DENY
DENY kullanarak sayfanızın herhangi bir iframe içinde görüntülenmesini engellersiniz. Belirli kaynakların aynı etki alanında çerçevelemesine izin vermeniz gerekiyorsa SAMEORIGIN kullanın. X-Frame-Options geniş bir şekilde desteklenirken, daha yeni CSP yönergesi frame-ancestors daha ince granüler kontrol sunar ve modern CSP standardının bir parçasıdır.
3. X-Content-Type-Options ile MIME Türü Koklamayı Yönetme
Tarayıcılar, bir kaynağın nasıl ele alınacağını belirlemek için sunucu farklı bir tür belirtse bile, genellikle bir kaynağın MIME türünü "koklamaya" çalışır. Örneğin, bir saldırgan kötü amaçlı bir komut dosyasını image.png olarak yüklerse, koklayan bir tarayıcı bunu JavaScript olarak çalıştırabilir.
X-Content-Type-Options başlığı, tarayıcının sunucu tarafından gönderilen Content-Type başlığını kesinlikle takip etmesini zorlayarak bu davranışı engeller.
X-Content-Type-Options: nosniff
Bu tek başlık, düşük çaba gerektiren ancak yüksek etkiye sahip olan ve dosya uzantılarının güvenlik filtrelerini atlamak için kullanıldığı bir saldırı sınıfını önler.
4. Referrer-Policy ile Veri Açığının Kısıtlanması
Referer başlığı, kaynağa bağlantı veren sayfanın URL'sini belirtmek için her istekle birlikte gönderilir. Bu, oturum belirteçleri veya iç API yolları gibi hassas bilgileri üçüncü taraf sitelere yanlışlıkla sızdırabilir.
Referrer-Policy, ne kadar yönlendirici (referrer) bilgisinin paylaşılacağını kontrol etmenize olanak tanır. Çoğu uygulama için strict-origin-when-cross-origin dengeli bir seçenektir.
Referrer-Policy: strict-origin-when-cross-origin
Bu politika, aynı kaynaklı istekler için tam URL'yi gönderirken, çapraz kaynaklı istekler için yalnızca kökeni (origin) gönderir ve kullanıcı gizliliğini korumak için yolu ve sorgu dizesini kaldırır.
5. Strict-Transport-Security (HSTS) ile HTTPS Zorlaması
HTTP Strict Transport Security (HSTS), tarayıcıların sunucunuzla yalnızca HTTPS üzerinden iletişim kurmasını sağlar. Tarayıcıya alanınız için HTTP'yi asla kullanmamasını söyleyerek protokol düşürme saldırılarını ve çerez hırsızlığını önler.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age değeri, tarayıcının HTTPS kullanmayı ne kadar süreyle hatırlaması gerektiğini tanımlar. includeSubDomains bu kuralı tüm alt etki alanlarına uygular ve preload, daha erken zorlama için alanınızı büyük tarayıcılar tarafından korunulan küresel bir ön yükleme listesine göndermenize olanak tanır.
Sonuç
Güvenlik başlıklarını uygulamak "kur ve unut" görevi değildir; uygulamanız geliştiği sürece sürekli izleme ve ayarlama gerektirir. Ancak yukarıda belirtilen temel başlıklar—CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy ve HSTS—sağlam bir derinlik savunması stratejisi sağlar.
Bu başlıkları dağıtım hattınıza entegre ederek ve doğrulama için Content-Security-Policy-Report-Only gibi araçları kullanarak saldırı yüzeyinizi önemli ölçüde azaltabilirsiniz. Mozilla Observatory veya güvenlik tarayıcıları gibi araçları kullanarak mevcut başlıklarınızı bugün denetlemeye başlayın ve kullanıcılarınız için daha dayanıklı bir web uygulaması oluşturun.