MIME koklama ve X-Content-Type-Options: nosniff açıklaması
Sunucunuz yanlış Content-Type gönderse bile tarayıcılar, nasıl işleyeceğine karar vermek için bir yanıtın gerçek içeriğini "koklayabilir". X-Content-Type-Options: nosniff başlığı, tarayıcıya bildirilen türe güvenmesini ve dosyaları — yüklenen bir görüntü gibi — çalıştırılabilir betiğe yükseltmeyi reddetmesini söyler.
Nedir
MIME koklama, sunucunun Content-Type başlığı eksik veya içerikle eşleşmediğinde içerik türünü çıkarmak için bir yanıtın ilk baytlarını inceleyen bir tarayıcı buluşsal yöntemidir. Örneğin, <script> ile başlayan text/plain olarak bildirilen bir dosya yeniden sınıflandırılıp HTML olarak çalıştırılabilir.
X-Content-Type-Options tek değerli bir yanıt başlığıdır: X-Content-Type-Options: nosniff. Mevcut olduğunda tarayıcılar, bir yanıtı farklı bir MIME türüne yükseltmeyi reddeder — application/octet-stream olarak sunulan yüklenen bir dosya ikili kalır, asla çalıştırılabilir bir betik veya stil sayfasına dönüşmez.
Neden önemli
Kullanıcı tarafından oluşturulan içerik temel risktir. Uygulamanız dosya yüklemelerine izin veriyorsa ve bunları uygulamayla aynı kaynaktan sunuyorsanız, görüntü kılığına girmiş kötü amaçlı bir HTML dosyası koklandığında kurbanların tarayıcılarında çalıştırılabilir — sunucu tarafında uzantıları doğruluyor olsanız bile dosya yükleme yoluyla depolanmış bir XSS.
nosniff olmadan tarayıcılar, beklenmedik kaynaklardan alınan stil sayfalarını da çalıştırabilir. Betik olarak çalıştırılan bir stil sayfası, diğer yanlış yapılandırmalarla birleştiğinde çapraz kaynak veri sızdırma yolu oluşturur. nosniff, uygulamanızın her içerik sınırını güçlendiren düşük maliyetli küresel bir güvencedir.
Nasıl düzeltilir
API rotaları ve statik dosya rotaları dahil tüm yanıtlara uygulanması için next.config.js'de X-Content-Type-Options: nosniff'i ayarlayın.
// next.config.js
module.exports = {
async headers() {
return [
{
source: "/:path*",
headers: [
{ key: "X-Content-Type-Options", value: "nosniff" },
],
},
];
},
};nginx üzerinden proxylenen tüm yanıtlara uygulanması için server bloğuna direktifi ekleyin.
add_header X-Content-Type-Options "nosniff" always;nosniff, her yanıt doğru bir Content-Type başlığı taşıdığında en etkilidir. Kullanıcı yüklü dosyalar için uygun bir türle ve uygulamayla aynı kaynak yerine ayrı bir kaynak ya da depolama etki alanından sunun; böylece bir dosya çalışsa bile kullanıcılarınızın oturum çerezlerine erişemez.
Uzantı kontrolleri atlatılabilir. Dosyanın sihirli baytlarını sunucu tarafında incelemek için file-type (npm) gibi bir kütüphane kullanın ve depolama katmanına ulaşmadan önce izin verilen güvenli türler listesiyle eşleşmeyen her şeyi reddedin.
import { fileTypeFromBuffer } from "file-type";
const ALLOWED = new Set(["image/jpeg", "image/png", "image/webp", "image/gif"]);
async function validateUpload(buffer: Buffer): Promise<void> {
const type = await fileTypeFromBuffer(buffer);
if (!type || !ALLOWED.has(type.mime)) {
throw new Error("Upload rejected: unsupported file type");
}
}SSS
AppSafe, eksik X-Content-Type-Options başlığı için hangi önem derecesini raporlar?
Orta. Başlık, düşük sürtünmeli bir sertleştirme önlemidir — bir satır yapılandırma — dolayısıyla atlamak açık bir eksikliktir, ancak aktif sömürü ayrı bir yükleme veya enjeksiyon vektörü gerektirir.
nosniff normal sayfa yüklemelerini etkiler mi?
Pratikte hayır. nosniff yalnızca daha tehlikeli bir türe yükseltmeyi engeller. HTML, CSS ve JavaScript'iniz zaten doğru türlerle sunulduğundan normal yüklenir.
Modern tarayıcılar artık daha akıllı olduğuna göre X-Content-Type-Options hâlâ alakalı mı?
Evet. Koklama davranışı motorlar ve sürümler arasında farklılık gösterir ve bu başlık tek taşınabilir güvencedir. Tüm güncel tarayıcılar (Chrome, Firefox, Safari, Edge) nosniff'e uyar.
Uygulaman etkileniyor mu?
AppSafe, bunu ve onlarca başka sorunu tek bir ücretsiz taramada kontrol eder.
Uygulamamı ücretsiz taraİlgili rehberler
Content-Security-Policy (CSP): nedir ve nasıl eklenir
Enjekte edilen script'lerin çalışmasını durduran header.
Clickjacking ve X-Frame-Options: sayfalarını iframe'lerden uzak tut
Tek bir header, saldırganların uygulamanı bir iframe içinde katmanlamasını durdurur.
Açık dizin indeksleri: dosya sunucun her şeyi listelediğinde
İçeriğini listeleyen bir dosya sunucusu, saldırganlara bedava bir envanter sunar.