Penggunaan disposisi konten di header respons HTTP

127

Saya telah menemukan kode asp.net berikut ini sangat berguna ketika melayani file dari database:

Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);

Ini memungkinkan pengguna menyimpan file ke komputer mereka dan kemudian memutuskan bagaimana menggunakannya, alih-alih browser mencoba menggunakan file.

Apa hal lain yang bisa dilakukan dengan tajuk tanggapan disposisi konten?

Ronnie Overby
sumber
23
Perhatikan bahwa kode sampel Anda akan rusak jika nama file mengandung spasi putih atau karakter non-ASCII. Lihat RFC 6266 untuk informasi lebih lanjut.
Julian Reschke
@JulianReschke, Bagaimana dengan karakter ASCII yang dianggap tidak dapat dicetak? ( 0ke 0x1F)
Pacerier
Baca RFC 6266 (terlepas dari fakta bahwa itu akan menjadi ide yang buruk untuk digunakan dalam nama file; penerima kemungkinan akan membuangnya)
Julian Reschke
1
Anda dapat menggunakan ruang putih, Unicode dll. Jika Anda menggunakan tanda kutip ganda di sekitar nama. kb.mozillazine.org/…
Tony BenBrahim
1
@Ronnie Overby Apa itu Disposisi Konten?
divy3993

Jawaban:

84

Perhatikan bahwa RFC 6266 menggantikan RFC yang dirujuk di bawah ini. Bagian 7 menguraikan beberapa masalah keamanan terkait.

Wewenang pada header disposisi konten adalah RFC 1806 dan RFC 2183. Orang-orang juga telah merancang peretasan disposisi konten.Penting untuk dicatat bahwa header disposisi konten bukan bagian dari standar HTTP 1.1.

HTTP 1.1 Standard ( RFC 2616 ) juga menyebutkan kemungkinan efek samping keamanan dari disposisi konten:

15.5 Masalah Disposisi Konten

RFC 1806 [35], yang darinya
header Content-Disposition (lihat bagian 19.5.1) yang sering diimplementasikan diturunkan, memiliki sejumlah
pertimbangan keamanan yang sangat serius. Content-Disposition bukan bagian dari
standar HTTP, tetapi karena ini diterapkan secara luas, kami
mendokumentasikan penggunaan dan risikonya untuk implementor. Lihat RFC 2183 [49]
(yang memperbarui RFC 1806) untuk detailnya.

Andrew Austin
sumber
31
Saat ini, otoritasnya adalah RFC 6266.
Julian Reschke
@JulianReschke, Bagaimana cara "menggantikan" dan "pembaruan"? Apakah versi yang lebih baru seperti RFC 7230 juga menjadikan RFC 6266 sebagai usang?
Pacerier
@Pacerier - mengapa RFC 7230 memengaruhi RFC 6266?
Julian Reschke
@ Julius, 1) Sejak 6266 pembaruan 2616, 2) 2616 telah dibuat usang oleh 723X, 3) Lalu, apakah 6266 juga dianggap usang?
Pacerier
5
Nah, RFC 5678 di sini, RFC 9876 di sana. Jika Disposisi Konten tidak disukai, apa yang harus kita gunakan?
Csaba Toth
25

Ya, sepertinya header Content-Disposition pada awalnya dibuat untuk email, bukan web. ( Tautan ke RFC yang relevan .)

Saya menduga browser web dapat merespons

Response.AppendHeader("content-disposition", "inline; filename=" + fileName);

saat menyimpan, tapi saya tidak yakin.

MiffTheFox
sumber
5

Untuk pengguna asp.net, .NET framework menyediakan kelas untuk membuat header disposisi konten: System.Net.Mime.ContentDisposition

Penggunaan dasar:

var cd = new System.Net.Mime.ContentDisposition();
cd.FileName = "myFile.txt";
cd.ModificationDate = DateTime.UtcNow;
cd.Size = 100;
Response.AppendHeader("content-disposition", cd.ToString());
onof
sumber
1
Hati-hati, kelas ini tidak sesuai dengan RFC 6266 . Itu pengkodean UTF-8 base64 dalam filenameparameter, bukannya menggunakan filename*parameter dengan pengkodean RFC 5987 . Tidak ada cara untuk memperoleh atau menggunakan utilitas fx untuk memperbaikinya, hampir semuanya tidak dapat ditimpa atau internal ... .Net fx masih jauh belajar keterbukaan dan ekstensibilitas. Dalam MVC 5.2, FileResultkelas melakukan sedikit lebih baik untuk filename, tetapi tidak menangani parameter lain karena inlinedan sebagian besar implementasinya juga internal ...
Frédéric
2

Header ini didefinisikan dalam RFC 2183 , sehingga itu akan menjadi tempat terbaik untuk mulai membaca.

Nilai yang diizinkan adalah yang terdaftar di Internet Assigned Numbers Authority (IANA); mereka registri nilai-nilai harus dilihat sebagai sumber definitif.

NickFitz
sumber