Wykorzystuje dyspozycję treści w nagłówku odpowiedzi HTTP

127

Zauważyłem, że następujący kod asp.net jest bardzo przydatny podczas udostępniania plików z bazy danych:

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

Dzięki temu użytkownik może zapisać plik na swoim komputerze, a następnie zdecydować, jak go użyć, zamiast próbować użyć tego pliku przez przeglądarkę.

Jakie inne rzeczy można zrobić z nagłówkiem odpowiedzi dyspozycji dyspozycji treści?

Ronnie Overby
źródło
23
Zwróć uwagę, że przykładowy kod zostanie uszkodzony, jeśli nazwa pliku zawiera spacje lub znaki spoza zestawu ASCII. Aby uzyskać więcej informacji, zobacz RFC 6266.
Julian Reschke
@JulianReschke, A co ze znakami ASCII, które są uważane za niedrukowalne? ( 0do 0x1F)
Pacerier
Przeczytaj RFC 6266 (pomijając fakt, że użycie ich w nazwie pliku byłoby złym pomysłem; odbiorcy i tak prawdopodobnie je wyrzucą)
Julian Reschke
1
Możesz użyć spacji, Unicode itp., Jeśli użyjesz podwójnych cudzysłowów wokół nazwy. kb.mozillazine.org/…
Tony BenBrahim
1
@Ronnie Overby Co to jest dyspozycja treści?
divy3993

Odpowiedzi:

84

Należy zauważyć, że RFC 6266 zastępuje dokumenty RFC wymienione poniżej. Sekcja 7 przedstawia niektóre z powiązanych kwestii bezpieczeństwa.

Uprawnienia w nagłówku dyspozycji do treści to RFC 1806 i RFC 2183. Ludzie również wymyślili hakowanie dysponowania treścią. Należy zauważyć, że nagłówek dyspozycji treści nie jest częścią standardu HTTP 1.1.

Standard HTTP 1.1 ( RFC 2616 ) wspomina również o możliwych skutkach ubocznych zabezpieczeń związanych z rozmieszczaniem treści:

15.5 Kwestie dotyczące dyspozycji treści

RFC 1806 [35], z którego pochodzi często implementowany
nagłówek Content-Disposition (patrz sekcja 19.5.1) w HTTP, ma szereg bardzo
poważnych względów bezpieczeństwa. Dyspozycja treści nie jest częścią
standardu HTTP, ale ponieważ jest szeroko wdrażana,
dokumentujemy jej użycie i ryzyko dla implementujących. Szczegółowe informacje można znaleźć w dokumencie RFC 2183 [49]
(który aktualizuje RFC 1806).

Andrew Austin
źródło
31
Obecnie organem jest RFC 6266.
Julian Reschke
@JulianReschke, Jak działają „zastępuje” i „aktualizacje”? Czy nowsze wersje, takie jak RFC 7230, również powodują, że RFC 6266 jest przestarzały?
Pacerier,
@Pacerier - dlaczego RFC 7230 miałby wpływać na RFC 6266?
Julian Reschke
@Julian, 1) Od 6266 aktualizacji 2616, 2) 2616 stało się przestarzałe przez 723X, 3) Czy 6266 również jest uważane za przestarzałe?
Pacerier,
5
Cóż, RFC 5678 tutaj, RFC 9876 tam. Jeśli nastawienie treści jest źle widziane, czego powinniśmy użyć zamiast tego?
Csaba Toth
25

Wygląda na to, że nagłówek Content-Disposition został pierwotnie utworzony dla poczty e-mail, a nie dla sieci. ( Link do odpowiedniego RFC .)

Domyślam się, że przeglądarki internetowe mogą na nie reagować

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

podczas zapisywania, ale nie jestem pewien.

MiffTheFox
źródło
5

Dla użytkowników asp.net platforma .NET udostępnia klasę do tworzenia nagłówka dyspozycji zawartości: System.Net.Mime.ContentDisposition

Podstawowe użycie:

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
źródło
1
Uwaga, ta klasa nie jest zgodna z RFC 6266 . Wykonuje kodowanie UTF-8 base64 w filenameparametrze, zamiast używać filename*parametru z kodowaniem RFC 5987 . Nie ma sposobu, aby wyprowadzić lub użyć narzędzi fx, aby to naprawić, prawie wszystko jest nienaruszalne lub wewnętrzne ... .Net fx wciąż ma długą drogę do nauczenia się otwartości i rozszerzalności. W MVC 5.2 FileResultklasa radzi sobie trochę lepiej filename, ale nie obsługuje innych parametrów, inlinea większość jej implementacji jest również wewnętrzna ...
Frédéric
2

Ten nagłówek jest zdefiniowany w RFC 2183 , więc będzie to najlepsze miejsce do rozpoczęcia czytania.

Dozwolone wartości to wartości zarejestrowane przez Internet Assigned Numbers Authority (IANA); ich rejestr wartości należy traktować jako ostateczne źródło.

NickFitz
źródło