Semua panduan
Tingkat SedangHeader Keamanan

MIME sniffing dan X-Content-Type-Options: penjelasan nosniff

Browser dapat "mengendus" konten sebenarnya dari sebuah respons untuk memutuskan cara menanganinya, meskipun server Anda mengirimkan Content-Type yang salah. Header X-Content-Type-Options: nosniff memberi tahu browser untuk mempercayai tipe yang dideklarasikan dan menolak mempromosikan file — seperti gambar yang diunggah — menjadi skrip yang dapat dieksekusi.

Apa itu

MIME sniffing adalah heuristik browser yang memeriksa beberapa byte pertama dari respons untuk menyimpulkan jenis kontennya ketika header Content-Type server tidak ada atau tidak cocok dengan konten. Misalnya, file yang dideklarasikan sebagai text/plain yang dimulai dengan <script> mungkin diklasifikasikan ulang dan dieksekusi sebagai HTML.

X-Content-Type-Options adalah header respons bernilai tunggal: X-Content-Type-Options: nosniff. Ketika ada, browser menolak untuk mempromosikan respons ke tipe MIME yang berbeda — file yang diunggah dan disajikan sebagai application/octet-stream tetap biner, tidak pernah menjadi skrip atau stylesheet yang dapat dieksekusi.

Kenapa penting

Konten yang dibuat pengguna adalah risiko utama. Jika aplikasi Anda mengizinkan unggahan file dan Anda menyajikannya dari origin yang sama dengan aplikasi, file HTML berbahaya yang menyamar sebagai gambar dapat dieksekusi di browser korban saat di-sniff — XSS tersimpan melalui unggahan file, bahkan saat Anda memvalidasi ekstensi di sisi server.

Tanpa nosniff, browser juga dapat mengeksekusi stylesheet yang diambil dari sumber yang tidak terduga. Stylesheet yang dieksekusi sebagai skrip menciptakan jalur eksfiltrasi data lintas origin ketika dikombinasikan dengan miskonfigurasi lainnya. nosniff adalah perlindungan global berbiaya rendah yang memperkuat setiap batas konten dalam aplikasi Anda.

Cara memperbaiki

Tambahkan header secara global di Next.js

Tetapkan X-Content-Type-Options: nosniff di next.config.js agar berlaku untuk semua respons, termasuk rute API dan rute file statis.

// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: "/:path*",
        headers: [
          { key: "X-Content-Type-Options", value: "nosniff" },
        ],
      },
    ];
  },
};
Konfigurasikan di nginx

Tambahkan direktif di blok server agar berlaku untuk semua respons yang diproksikan melalui nginx.

add_header X-Content-Type-Options "nosniff" always;
Selalu deklarasikan Content-Type yang akurat

nosniff paling efektif ketika setiap respons juga membawa header Content-Type yang benar. Untuk file yang diunggah pengguna, sajikan dengan tipe yang sesuai dan dari origin atau domain penyimpanan yang terpisah — bukan origin yang sama dengan aplikasi — sehingga meskipun file dieksekusi, ia tidak dapat mengakses cookie sesi pengguna Anda.

Validasi unggahan berdasarkan konten, bukan hanya ekstensi

Pemeriksaan ekstensi dapat dilewati. Gunakan pustaka seperti file-type (npm) untuk memeriksa magic byte file di sisi server dan tolak apa pun yang tidak cocok dengan daftar jenis aman yang diizinkan sebelum mencapai lapisan penyimpanan.

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");
  }
}

FAQ

Tingkat keparahan apa yang dilaporkan AppSafe untuk header X-Content-Type-Options yang hilang?

Sedang. Header ini adalah langkah penguatan dengan hambatan rendah — satu baris konfigurasi — jadi mengabaikannya adalah celah yang jelas, tetapi eksploitasi aktif memerlukan vektor unggahan atau injeksi yang terpisah.

Apakah nosniff memengaruhi pemuatan halaman normal?

Tidak dalam praktiknya. nosniff hanya memblokir promosi ke tipe yang lebih berbahaya. HTML, CSS, dan JavaScript Anda sudah disajikan dengan tipe yang benar sehingga dimuat secara normal.

Apakah X-Content-Type-Options masih relevan sekarang browser modern lebih cerdas?

Ya. Perilaku sniffing bervariasi antara engine dan versi, dan header ini adalah satu-satunya jaminan yang portabel. Semua browser saat ini (Chrome, Firefox, Safari, Edge) menghormati nosniff.

Apakah aplikasimu terpengaruh?

AppSafe memeriksa ini dan puluhan masalah lain dalam satu pemindaian gratis.

Pindai aplikasiku gratis