Verwendung der Inhaltsdisposition in einem HTTP-Antwortheader

127

Ich habe festgestellt, dass der folgende asp.net-Code beim Bereitstellen von Dateien aus einer Datenbank sehr nützlich ist:

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

Auf diese Weise kann der Benutzer die Datei auf seinem Computer speichern und dann entscheiden, wie sie verwendet werden soll, anstatt dass der Browser versucht, die Datei zu verwenden.

Welche anderen Dinge können mit dem Antwortheader für die Inhaltsdisposition getan werden?

Ronnie Overby
quelle
23
Beachten Sie, dass Ihr Beispielcode unterbrochen wird, wenn der Dateiname Leerzeichen oder Nicht-ASCII-Zeichen enthält. Weitere Informationen finden Sie in RFC 6266.
Julian Reschke
@JulianReschke, Was ist mit ASCII-Zeichen, die als nicht druckbar gelten? ( 0zu 0x1F)
Pacerier
Lesen Sie RFC 6266 (abgesehen von der Tatsache, dass es eine schlechte Idee wäre, sie in einem Dateinamen zu verwenden; Empfänger werden sie wahrscheinlich sowieso wegwerfen)
Julian Reschke
1
Sie können Leerzeichen, Unicode usw. verwenden, wenn Sie den Namen in doppelte Anführungszeichen setzen. kb.mozillazine.org/…
Tony BenBrahim
1
@ Ronnie Overby Was ist Inhaltsdisposition?
Divy3993

Antworten:

84

Beachten Sie, dass RFC 6266 die unten genannten RFCs ersetzt. In Abschnitt 7 werden einige der damit verbundenen Sicherheitsbedenken beschrieben.

Die Autorität für den Content-Disposition-Header ist RFC 1806 und RFC 2183. Die Leute haben auch Content-Disposition-Hacking entwickelt. Es ist wichtig zu beachten, dass der Header für die Inhaltsdisposition nicht Teil des HTTP 1.1-Standards ist.

Der HTTP 1.1-Standard ( RFC 2616 ) erwähnt auch die möglichen Sicherheitsnebenwirkungen der Inhaltsdisposition:

15.5 Probleme mit der Inhaltsdisposition

RFC 1806 [35], aus dem der häufig implementierte Content-Disposition-
Header (siehe Abschnitt 19.5.1) in HTTP abgeleitet wird, weist eine Reihe sehr
schwerwiegender Sicherheitsaspekte auf. Content-Disposition ist nicht Teil des
HTTP-Standards, aber da er weit verbreitet ist,
dokumentieren wir seine Verwendung und Risiken für Implementierer. Weitere
Informationen finden Sie in RFC 2183 [49] (das RFC 1806 aktualisiert).

Andrew Austin
quelle
31
Heutzutage ist die Autorität RFC 6266.
Julian Reschke
@JulianReschke, Wie funktionieren "Ersetzt" und "Aktualisieren"? Machen neuere Versionen wie RFC 7230 RFC 6266 auch veraltet?
Pacerier
@Pacerier - warum sollte RFC 7230 RFC 6266 beeinflussen?
Julian Reschke
@Julian, 1) Seit 6266 Updates 2616, 2) 2616 durch 723X veraltet ist, 3) Wird 6266 dann auch als veraltet angesehen?
Pacerier
5
Nun, RFC 5678 hier, RFC 9876 dort. Was sollten wir stattdessen verwenden, wenn Content-Disposition verpönt ist?
Csaba Toth
25

Nun, es scheint, dass der Content-Disposition-Header ursprünglich für E-Mails erstellt wurde, nicht für das Web. ( Link zum relevanten RFC .)

Ich vermute, dass Webbrowser darauf reagieren können

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

beim Speichern, aber ich bin nicht sicher.

MiffTheFox
quelle
5

Für asp.net-Benutzer bietet das .NET-Framework eine Klasse zum Erstellen eines Inhaltsdisposition-Headers: System.Net.Mime.ContentDisposition

Grundlegende Verwendung:

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
quelle
1
Beachten Sie, dass diese Klasse nicht RFC 6266 entspricht . Es führt eine UTF-8-Base64-Codierung in filenameParametern durch, anstatt filename*Parameter mit RFC 5987- Codierung zu verwenden. Es gibt keine Möglichkeit, FX-Utils abzuleiten oder zu verwenden, um dies zu beheben. Fast alles ist nicht überschreibbar oder intern. Net FX hat noch einen langen Weg vor sich, um Offenheit und Erweiterbarkeit zu erlernen. In MVC 5.2 ist die FileResultKlasse etwas besser für filenameandere Parameter, behandelt sie jedoch nicht, da der inlinegrößte Teil ihrer Implementierung auch intern ist ...
Frédéric
2

Dieser Header ist in RFC 2183 definiert , sodass Sie am besten mit dem Lesen beginnen können.

Zulässige Werte sind diejenigen, die bei der Internet Assigned Numbers Authority (IANA) registriert sind. Ihr Wertregister sollte als endgültige Quelle angesehen werden.

NickFitz
quelle