HTTPQUERY
Bahasa Indonesia

X-Content-Type-Options

Penggunaan

MIME sniffing adalah perilaku browser ketika browser memeriksa isi sebuah respons dan menimpa Content-Type yang dideklarasikan berdasarkan pola yang ditemukan di body respons. Meskipun dimaksudkan sebagai kemudahan bagi server yang salah konfigurasi, MIME sniffing membuka celah keamanan: penyerang mengunggah file yang disamarkan sebagai gambar, browser mengendus isinya sebagai HTML atau JavaScript, lalu serangan cross-site scripting pun dieksekusi.

Header X-Content-Type-Options menutup celah tersebut. Ketika disetel ke nosniff, browser mengikuti header Content-Type secara ketat dan menolak memuat sumber daya yang tipe deklarasinya tidak cocok dengan tipe yang diharapkan. Untuk tujuan style, browser memblokir respons kecuali Content-Type-nya adalah text/css. Untuk tujuan script, browser memblokir respons kecuali Content-Type-nya merupakan tipe MIME JavaScript yang valid.

Header ini diterapkan secara luas sebagai langkah pengerasan keamanan standar dan disarankan untuk dipakai bersama Content-Security-Policy serta X-Frame-Options demi pertahanan berlapis.

nosniff

Nilai nosniff adalah satu-satunya nilai yang didefinisikan. Menyetel direktif ini mencegah browser melakukan MIME sniffing yang menyimpangkan sebuah respons dari Content-Type yang dideklarasikan.

Contoh

Server yang mengirimkan respons API JSON dengan MIME sniffing dinonaktifkan, memastikan browser memperlakukan respons tersebut secara ketat sebagai JSON:

Content-Type: application/json
X-Content-Type-Options: nosniff

Berkas CSS yang disajikan dengan Content-Type yang benar beserta perlindungan sniffing, mencegah browser menafsirkan ulang berkas tersebut:

Content-Type: text/css
X-Content-Type-Options: nosniff

Pemecahan masalah

Sumber daya yang diblokir oleh nosniff menghasilkan error di konsol yang menyebutkan ketidakcocokan tipe MIME antara Content-Type yang dideklarasikan dan tipe yang diharapkan untuk tujuan sumber daya tersebut.

Script diblokir karena ketidakcocokan tipe MIME. Browser mencatat Refused to execute script from ’…’ because its MIME type (‘text/plain’) is not executable. Hal ini terjadi ketika server mengirim berkas JavaScript dengan Content-Type selain tipe MIME JavaScript yang valid (text/javascript, application/javascript). Perbaiki konfigurasi server. Pada nginx, pastikan include mime.types; muncul di dalam blok http. Pada Apache, pastikan AddType text/javascript .js ada di konfigurasi atau .htaccess.

CSS tidak diterapkan akibat tipe MIME yang salah dengan nosniff. Konsol menampilkan Refused to apply style from ’…’ because its MIME type (‘text/html’) is not a supported stylesheet MIME type. Server mengirim berkas CSS sebagai text/html atau text/plain alih-alih text/css. Pada nginx, menambahkan types { text/css css; } atau menyertakan berkas mime.types bawaan akan menyelesaikan ketidakcocokan tersebut. Pada Apache, tambahkan AddType text/css .css ke konfigurasi server.

Server mengirim Content-Type yang salah untuk berkas statis. Server yang salah konfigurasi, CDN, atau penyimpanan objek (S3, GCS) kerap menyajikan berkas statis sebagai application/octet-stream atau text/plain. Periksa Content-Type setiap sumber daya melalui tab Network pada DevTools dengan memilih permintaan tersebut dan meninjau header responsnya. Untuk S3, setel metadata ContentType saat mengunggah. Untuk aset yang disajikan lewat CDN, pastikan origin mengembalikan tipe yang benar karena sebagian besar CDN meneruskan Content-Type dari origin tanpa perubahan.

Mendiagnosis sumber daya yang diblokir di DevTools Console. Buka tab Console dan saring error yang berkaitan dengan MIME. Setiap pesan sumber daya yang diblokir memuat URL, tipe MIME yang dideklarasikan, dan tipe yang diharapkan. Bandingkan silang dengan tab Network: pilih permintaan yang diblokir, buka panel Headers, lalu periksa header respons Content-Type. Perbaikannya selalu dengan mengoreksi Content-Type di server, bukan dengan menghapus header nosniff.

Konfigurasi

Terapkan nosniff pada semua respons. Overhead-nya dapat diabaikan, sementara perlindungannya mencakup script, style, dan subsumber daya lainnya.

nginx:

add_header X-Content-Type-Options nosniff always;

Apache:

Header always set X-Content-Type-Options nosniff

IIS (web.config):

<code class="language-xml"><customHeaders>
  <add name="X-Content-Type-Options"
       value="nosniff" />
</customHeaders>