- Konu sahibi
- #1
X-Content-Type-Options: nosniff yanıt başlığı, tarayıcının sunucunun gönderdiği
Bu başlık dosyanın güvenli olduğunu kanıtlamaz, zararlı kodu temizlemez ve tek başına XSS açığını kapatmaz. Sunucu yine doğru
Bir tarayıcı
Örneğin sunucu, JavaScript dosyasını
Bu başlık özellikle script/style hedeflerinde beklenen MIME türüne göre engelleme sağlar; sayfa navigasyonunda da belirtilen türün esas alınmasına yardımcı olur. text/plain sunulan yükleme HTML gibi tahmin edilmemelidir. Ancak zararlı HTML zaten text/html ile güvenilir kökende sunuluyorsa nosniff onu temizlemez; özel indirme/ayrı origin/Content-Disposition ihtiyacı ayrıca değerlendirilir.
Sunucunuzun yapılandırma yöntemine göre aşağıdaki en küçük örneklerden uygun olanını kullanın. Aynı yanıt için başlığın birden fazla kez eklenmediğinden emin olun.
Apache için temel yapılandırma örneği şöyledir:
Nginx kullanan sistemlerde karşılığı şöyledir:
Apache örneği mod_headers gerektirir; .htaccess kullanılıyorsa ilgili override izni gerekir. Nginx add_header mirası alt location’da başka add_header tanımlanmasıyla değişebilir; kurulu sürümün miras davranışını kontrol edin. Her ikisinde de gerçek HTML, JS, CSS ve hata yanıtını ayrı doğrulayın. Yapılandırma değişikliğinden sonra sunucunun kabul ettiği sözdizimiyle doğrulama yapmadan yeniden yükleme gerçekleştirmeyin.
Aşağıdaki ayrım, başlığın neyi çözdüğünü ve neyi çözmediğini gösterir:
Başlığın görünmesi başarıyla eklendiğini gösterir; ancak uygulamanın tüm kaynaklarının doğru MIME türleriyle çalıştığını göstermez. Özellikle CDN, önbellek, ters proxy ve dosya indirme uç noktalarında ayrı yanıt kontrolü yapın. Beklenmedik bir engelleme varsa ilk inceleme noktası, engellenen yanıtın gerçek
curl -I HEAD ister; uygulama HEAD/GET’i farklı işliyorsa asıl GET yanıtını da kontrol edin (örneğin curl -sS -D - -o /dev/null URL). Bu komut gövdeyi indirip atar, yalnız başlık isteği değildir. Başlığın mevcut olması gerçek tarayıcıda doğru kaynağın çalıştığını tek başına kanıtlamaz.
Başlığı yalnızca HTML yanıtına eklemek: Sorun genellikle script, CSS veya indirilebilir dosya yanıtında ortaya çıkar. Başlığın gerekli yanıt türlerinde gerçekten gönderildiğini kontrol edin.
Her şeyi
Başlığı güvenlik politikası sanmak:
Content-Type değerini tahmin ederek farklı bir içerik türüyle yorumlamasını önler. En önemli etkisi, yanlış MIME türüyle sunulan JavaScript veya CSS dosyalarının tarayıcı tarafından çalıştırılmasını ya da stil dosyası olarak uygulanmasını engellemektir. Böylece hatalı yapılandırma ve bazı içerik türü karıştırma saldırıları için tarayıcı tarafında ek bir sınır oluşturur.Bu başlık dosyanın güvenli olduğunu kanıtlamaz, zararlı kodu temizlemez ve tek başına XSS açığını kapatmaz. Sunucu yine doğru
Content-Type göndermelidir. Örneğin JavaScript dosyası JavaScript MIME türüyle, CSS dosyası CSS MIME türüyle sunulmalıdır.Nasıl çalışır?
Bir tarayıcı
/assets/app.js isteğine yanıt aldığında, yanıt başlığındaki Content-Type değerini dikkate alır. Değer dosyanın gerçek içeriğiyle uyumsuzsa, nosniff tarayıcının içeriği inceleyip başka bir tür olarak kabul etmesine izin vermez. Bunun sonucu, özellikle script ve style bağlamlarında içeriğin reddedilmesi olabilir.Örneğin sunucu, JavaScript dosyasını
text/plain olarak gönderiyorsa dosyayı rastgele JavaScript kabul ettirmeye çalışmak yerine MIME türü hatasını düzeltmek gerekir. Başlık eklendiğinde uygulama çalışmayı bırakıyorsa bu genellikle güvenlik başlığının bozuk yapılandırmayı görünür hale getirdiği anlamına gelir; başlığı kaldırmak yerine yanıt türünü düzeltmek doğru adımdır.Bu başlık özellikle script/style hedeflerinde beklenen MIME türüne göre engelleme sağlar; sayfa navigasyonunda da belirtilen türün esas alınmasına yardımcı olur. text/plain sunulan yükleme HTML gibi tahmin edilmemelidir. Ancak zararlı HTML zaten text/html ile güvenilir kökende sunuluyorsa nosniff onu temizlemez; özel indirme/ayrı origin/Content-Disposition ihtiyacı ayrıca değerlendirilir.
Uygulama ve kontrol
Sunucunuzun yapılandırma yöntemine göre aşağıdaki en küçük örneklerden uygun olanını kullanın. Aynı yanıt için başlığın birden fazla kez eklenmediğinden emin olun.
- Tüm HTTP yanıtlarında şu başlığın gönderilmesini sağlayın:
X-Content-Type-Options: nosniff. - Statik dosyalar için gerçek içerik türlerini düzeltin; JavaScript, CSS, görsel ve belge yanıtlarının
Content-Typedeğerlerini dosyanın kullanımına uygun hale getirin. - Yapılandırmayı kaydedip ilgili alan adından bir yanıt kontrol edin. Örnek kontrol komutu:
Kod:curl -I https://example.com/assets/app.js - Çıktıda
X-Content-Type-Options: nosniffsatırını ve beklenenContent-Typedeğerini arayın. Başlık yoksa istek başka bir proxy, CDN veya uygulama katmanından dönüyor olabilir; her katmanı ayrı kontrol edin. - Tarayıcı geliştirici araçlarında engellenen kaynakları inceleyin. Bir script veya stil dosyası MIME türü nedeniyle reddediliyorsa ilgili yanıtın türünü düzeltin ve yeniden deneyin.
Apache için temel yapılandırma örneği şöyledir:
Kod:
Header always set X-Content-Type-Options "nosniff"
Nginx kullanan sistemlerde karşılığı şöyledir:
Kod:
add_header X-Content-Type-Options "nosniff" always;
Apache örneği mod_headers gerektirir; .htaccess kullanılıyorsa ilgili override izni gerekir. Nginx add_header mirası alt location’da başka add_header tanımlanmasıyla değişebilir; kurulu sürümün miras davranışını kontrol edin. Her ikisinde de gerçek HTML, JS, CSS ve hata yanıtını ayrı doğrulayın. Yapılandırma değişikliğinden sonra sunucunun kabul ettiği sözdizimiyle doğrulama yapmadan yeniden yükleme gerçekleştirmeyin.
Aşağıdaki ayrım, başlığın neyi çözdüğünü ve neyi çözmediğini gösterir:
| Konu | nosniff etkisi | Doğru yaklaşım |
|---|---|---|
| Yanlış MIME türüyle JavaScript | Tarayıcının içeriği script olarak tahmin etmesini engelleyebilir | Doğru Content-Type gönderin |
| Yanlış MIME türüyle CSS | Stil dosyasının uygulanması reddedilebilir | CSS yanıtını doğru türle sunun |
| Zararlı dosya veya XSS kodu | İçeriği temizlemez ve açığı tek başına kapatmaz | Girdi doğrulama, çıktı kodlama ve erişim kontrollerini ayrıca uygulayın |
Başlığın görünmesi başarıyla eklendiğini gösterir; ancak uygulamanın tüm kaynaklarının doğru MIME türleriyle çalıştığını göstermez. Özellikle CDN, önbellek, ters proxy ve dosya indirme uç noktalarında ayrı yanıt kontrolü yapın. Beklenmedik bir engelleme varsa ilk inceleme noktası, engellenen yanıtın gerçek
Content-Type değeridir.curl -I HEAD ister; uygulama HEAD/GET’i farklı işliyorsa asıl GET yanıtını da kontrol edin (örneğin curl -sS -D - -o /dev/null URL). Bu komut gövdeyi indirip atar, yalnız başlık isteği değildir. Başlığın mevcut olması gerçek tarayıcıda doğru kaynağın çalıştığını tek başına kanıtlamaz.
Sık yapılan hatalar
Başlığı yalnızca HTML yanıtına eklemek: Sorun genellikle script, CSS veya indirilebilir dosya yanıtında ortaya çıkar. Başlığın gerekli yanıt türlerinde gerçekten gönderildiğini kontrol edin.
Her şeyi
application/octet-stream yapmak: Bu, MIME türü sorununu çözmez; tarayıcıda kaynakların çalışmamasına veya dosyaların beklenmedik biçimde indirilmesine yol açabilir. İçeriğe uygun tür kullanın.Başlığı güvenlik politikası sanmak:
nosniff yalnızca içerik türü yorumlamasını sınırlar. CSP, güvenli çerez ayarları, erişim denetimi ve sunucu güncellemeleri gibi diğer korumaların yerine geçmez.Kaynaklar
- WHATWG Fetch: nosniff engelleme algoritması
- MDN: X-Content-Type-Options
- Nginx: Yanıt başlıkları ve miras
Sık sorulan sorular
Bu başlık dosya yükleme güvenliğini sağlar mı?
Hayır. Yüklenen dosyanın türünü, içeriğini, adını ve çalıştırılabilir olup olmadığını sunucu tarafında ayrıca doğrulamak gerekir. Dosyaları web kökünden ayrı tutmak da mimariye göre gerekli olabilir.Başlık eklendiğinde mevcut JavaScript çalışmıyorsa kaldırmalı mıyım?
Genellikle hayır. Önce tarayıcıdaki ağ yanıtını veContent-Type değerini kontrol edin; çoğu durumda düzeltilmesi gereken nokta kaynak dosyasının sunucu yapılandırmasıdır.