Jenis file MIME tidak dikenal?

140

Apakah saya harus menentukan jenis MIME jika file yang diunggah tidak memiliki ekstensi? Dengan kata lain apakah ada tipe MIME umum standar?

Shimmy Weitzhandler
sumber

Jawaban:

184

Anda dapat menggunakan application/octet-streamuntuk jenis yang tidak dikenal.

RFC 2046 menyatakan di bagian 4.5.1:

Subtipe "octet-stream" digunakan untuk menunjukkan bahwa suatu badan berisi data biner yang sewenang-wenang.

Bombe
sumber
3
Sebenarnya, per RFC, Anda tidak boleh mengirim informasi jenis apa pun dengan data yang tidak dikenal. RFC-2046 hanya mendefinisikan jenis yang diketahui tetapi RFC-7231 memberi tahu Anda cara menangani jenis yang tidak dikenal.
Sampo Sarrala - codidact.org
@SampoSarrala Saya membaca RFC-7231 sedikit berbeda: "Jika bidang header Tipe Konten tidak ada, penerima MUNGKIN menganggap jenis media" aplikasi / octet-stream "([RFC2046], Bagian 4.5.1) atau memeriksa data untuk menentukan tipenya. " Saya menafsirkan bahwa kita harus mengirim NO-Jenis Konten atau kita aman untuk mengirim aplikasi / octet-stream sebagai default jika kita tidak ingin klien bermain menebak permainan dengan pemeriksaan konten.
Jpnh
1
@Jpnh Ya, benar. Header Jenis-Konten tidak boleh ada saat tidak diketahui. Anda juga dapat mengirim aplikasi / octet-stream yang pada dasarnya memberi tahu klien bahwa " Anda tidak ingin menampilkannya sekarang, tetapi teruskan dan simpan byte ini ke file sebagai gantinya ". Ini membuat klien web menawarkan file penyimpanan. Opsi 1 == Tidak tahu apa-apa tentang file ini. Opsi 2 == Konten file tidak dapat dijelaskan menggunakan mime atau hanya disimpan ke disk. Dalam praktiknya, opsi itu benar. Saya harus memilih kata-kata yang lebih baik untuk menghindari kebingungan.
Sampo Sarrala - codidact.org
4
"Data biner sewenang-wenang" bukan "tidak dikenal". Dengan menggunakan aplikasi / octet-stream Anda memberi tahu browser bahwa jenis konten diketahui, bukan teks atau gambar tetapi data biner yang sewenang-wenang dan sebagai hasilnya harus diunduh ke file dan mungkin dieksekusi. Selain itu, ini adalah lubang keamanan, terutama mengingat manajer unduhan modern yang nyaris tidak terlihat. Jawaban yang tepat adalah tidak ada header tipe konten. Jika Anda tidak tahu jenis file apa itu, peramban mungkin mengetahuinya jadi biarkan menebak, terutama ketika diketahui konteks penggunaannya (gambar, dokumen, skrip, ...)
FF_Dev
@ FFFDev Saya yakin itu omong kosong. "Data biner sewenang-wenang" tidak berarti "dapat dieksekusi"; tidak ada alasan browser (atau pengelola unduhan) harus menganggap application/octet-streamfile dapat dieksekusi. Dan bahkan jika suatu browser secara sadar mengunduh file yang dapat dieksekusi, itu tidak "mungkin mengeksekusi" itu tanpa diminta oleh pengguna; hanya mengunduh yang dapat dieksekusi tidak menyiratkan bahwa saya ingin dieksekusi sekarang. Jika benar-benar ada peramban yang dapat mengeksekusi application/octet-streamfile secara otomatis saat diunduh, beri tahu kami yang mana, dan bagaimana cara mereproduksi perilaku tersebut. Saat ini aku tidak percaya padamu.
Mark Amery
38

Sumber daya RFC:

Kita harus menggunakan RFC-7231 (HTTP / 1.1 Semantik dan Konten) sebagai referensi alih-alih RFC-2046 (Jenis Media) karena pertanyaan jelas tentang Jenis Konten HTTP.

Juga RFC-2046 tidak secara jelas mendefinisikan jenis yang tidak diketahui tetapi RFC-7231 tidak.

Jawaban singkat:

Jangan kirim tipe MIME untuk data yang tidak dikenal.
Agar lebih jelas: Jangan gunakan header Tipe Konten sama sekali.

Referensi:

RFC-7231
Hypertext Transfer Protocol (HTTP / 1.1): Semantik dan Konten
3.1.1.5. Jenis konten

Seorang pengirim yang menghasilkan pesan yang berisi badan muatan HARUS
menghasilkan bidang header Jenis-Konten dalam pesan itu kecuali jika
jenis media yang dimaksud dari representasi terlampir tidak diketahui
pengirim.

Bagian itu dengan jelas memberitahu Anda untuk meninggalkannya jika Anda tidak mengetahuinya dengan pasti. Ia juga memberi tahu bahwa penerima dapat berasumsi bahwa tipe adalah application / octet-stream tetapi masalahnya adalah mungkin juga sesuatu yang lain.

Apa bedanya?

RFC-2046
4.5.1. Subtipe Oktet-Stream

Tindakan yang disarankan untuk implementasi yang menerima
entitas "application / octet-stream" adalah dengan hanya menawarkan untuk memasukkan data ke
dalam file, dengan segala Konten-Transfer-Pengkodean dibatalkan, atau mungkin
menggunakannya sebagai input ke input yang ditentukan pengguna proses.

Dan, sebagaimana telah dinyatakan di atas:

RFC-7231
3.1.1.5. Jenis konten

Jika bidang header Tipe Konten tidak ada, penerima MUNGKIN dapat mengambil jenis media "aliran aplikasi / octet"
([RFC2046], Bagian 4.5.1) atau memeriksa data untuk menentukan jenisnya.

Kesimpulan:

Jika Anda mendefinisikannya sebagai "application / octet-stream" maka Anda mengatakan bahwa Anda tahu itu "application / octet-stream".

Jika Anda tidak mendefinisikannya maka Anda mengatakan bahwa Anda tidak tahu apa itu dan meninggalkan keputusan untuk penerima dan penerima kemudian dapat memeriksa apakah itu berjalan seperti bebek dan ...

Sampo Sarrala - codidact.org
sumber
1
Jawaban ini pantas dipilih karena ini adalah satu-satunya kebenaran. Selain itu, menggunakan "application / octet-stream" secara default membuat sebagian besar unduhan pemicu peramban merupakan lubang keamanan mengingat manajer unduhan modern yang hampir tidak terlihat.
FF_Dev
1
Ini benar untuk HTTP, tetapi pertanyaannya adalah tentang MIME secara umum, bukan tentang HTTP. Dalam email, misalnya, aturannya sangat berbeda. Lihat juga diskusi di duplikat stackoverflow.com/questions/12539058/… yang
tripleee
Saya memberikan uptick untuk alasan yang sama, namun saya setuju dengan FF_Dev. Kecuali jika maksudnya adalah "application / octet-stream" dan untuk memicu unduhan, ada kebutuhan untuk "application / unknown". Alangkah baiknya jika browser tidak akan mencoba mengunduh file jika "Content-Disposition" tidak diatur, tetapi ada terlalu banyak situs web yang secara sembarang mengunduh file tanpa mengatur nama file yang akan digunakan. Terutama bank.
justdan23
14

Saya lebih suka application/unknown, tetapi hasilnya pasti akan sama denganapplication/octet-stream

Lada
sumber
17
Apakah ada standar yang memungkinkan penggunaan aplikasi / tidak diketahui alih-alih aplikasi / octet-stream?
Hendrik Brummermann
3
Terima kasih! aplikasi / tidak dikenal berfungsi dengan baik, hasil octet-stream kesalahan di chrome di png-file sampel saya!
fnkr
10
Mengapa menyajikan file .png sebagai application/octet-streamatau application/unknown? Ada alasan mereka menemukan image/png.
Aidiakapi
10
@ jenson-button-event Tidak ada hubungannya dengan menciptakan kembali roda. Jenis MIME menentukan maksud Anda. Jika Anda tahu bahwa apa yang Anda kirim seharusnya merupakan gambar png, sampaikan informasi itu. Jika byte secara tidak sengaja mewakili jpeg, aplikasi Anda dapat memperingatkan Anda bahwa itu bukan png yang valid, dan bahwa Anda memiliki bug di tempat lain. Selain itu, tidak semua aplikasi sama kuat dan toleran dengan browser. Mereka dirancang untuk memperbaiki kesalahan programmer, tetapi tidak ada di dekat itu hanya tujuan. Peramban bukan satu-satunya aplikasi yang menggunakan tipe MIME.
Aidiakapi
2
Apa referensi anda? tipe tidak dikenal tidak menyumbangkan informasi apa pun mengenai konten atau keadaan file, atau bahkan jika itu berbasis biner atau teks, itu terlalu tidak jelas untuk kode produksi, mungkin ok untuk proyek kecil, karena jika file mimetype tidak memiliki handler di OS, ini pada dasarnya adalah sebuah biner yang dapat diunduh - dan tipe yang tidak dikenal adalah pegangan yang dikenal di OS windows, yang dapat Anda berikan tindakan (misalnya membuka file yang tidak diketahui dengan notepad). Meskipun praktik yang buruk, Anda dapat menggunakan jenis yang tidak diketahui yang dikombinasikan dengan ini untuk melewati eksekusi: /